docker 学习笔记
- docker run 镜像名:版本号 执行命令
例:docker run centos:7.3.1611 /bin/echo 'hello docker.'
- docker run -t -i centos:7.2.1611 /bin/bash
-t 表示在容器内制定一个伪终端或终端
-i 表示允许对容器的STDIN(标准输入)交互
- docker run -d centos:7.2.1611 /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d 会指定容器在后台进程模式运行
执行会返回一个容器ID(Container ID)
- docker ps
查看后台执行的所有容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
docker会随机给容器命名
- docker logs insane_babbage
查看正在运行的容器内的标准输出内容
- docker stop insane_babbage
停止正在运行的容器
- docker
查看docker的可执行的命令
- docker [command] [--help]
查看docker命令的使用方法
- docker run -d -P training/webapp python app.py
后台运行一个web容器
-P 用来将容器内部使用的网络端口映射到主机上的高位端口(通常是32768~61000)
training/web 是已经创建好的本地镜像
- docker ps -l
-l 命令会返回最后启动的容器的详细信息
默认情况下,docker ps只能查看正在运行的容器
docker -a 可以查看包括停止的容器、
- docker run -d -p 5000:5000 training/webapp python app.py
指定容器内部的5000端口映射到主机的5000端口
- docker port nostalgic_morse 5000
查看指定名字(或ID)的容器的某个端口映射到主机的端口
$ docker port nostalgic_morse 5000
0.0.0.0:49155
表示5000端口映射到了宿主机的49155端口
- docker logs -f nostalgic_mores
查看容器中的输出(类似于tail -f的效果)
- docker top nostalgic_mores
查看容器内运行的进程
- docker inspect nostalgic_mores
查看容器的配置和状态信息
[{
"ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
"Created": "2014-05-26T05:52:40.808952951Z",
"Path": "python",
"Args": [
"app.py"
],
"Config": {
"Hostname": "bc533791f3f5",
"Domainname": "",
"User": "",
. . .
- docker start nostalgic_morse
启动之前已经停止容器
- docker rm
移除之前已经停止的容器
- docker images
查看本地的镜像
- docker pull
下载镜像
$ docker pull centos
如果不写版本号相当于是 centos:latest (最新版) ,不过不建议不写版本
- Docker Hub 搜索和查看镜像
- docker search
搜索镜像
- 创建自己的镜像
$ docker run -t -i training/sinatra /bin/bash
root@0v2616b0e5a8:/#
在容器内执行命令安装软件、操作后输入exit
$ docker commit -m="comment" -a "author" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
操作以容器(0b2616b0e5a8)指定了一个用户名字(ouruser),以及名字(sinatra),指定了一个标签(v2)。
操作完成后便可以在docker images 中查看到新的 ouruser/sinatra 了
之后便可以用创建的镜像创建一个容器了
$ docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f68099f:/#
- 使用Dockerfile构建镜像
还可以使用Dockerfile创建镜像
# comment
FROM ubuntu:14.04
MAINTAINER Kate Smith <ksmith@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
每个指令必须都是大写的(FROM MAINTAINER RUN...)
可以用 # 来注释
FROM 指定从哪个镜像源创建
MAINTAINER 是镜像创建人的信息
RUN 则是执行一条命令
然后通过docker build
构建一个镜像
$ docker build -t ouruser/sinatra:v2 .
指在当前目录用Dockerfile文件构建一个镜像
- 设置镜像标签
docker tag 5db5f8471261 ouruser/sinatra:devel\
- 推送镜像到Docker Hub
$ docker push ouruser/sinatra
- 主机中移除镜像
$ docker rmi training/sinatra
- 指定docker容器的名字
$ docker run -d -P --name web training/webapp python app.py
或 查出容器的名字
$ docker inspect -f "{{ .Name }}" aed8ee21bde
- 容器的连接
$ docker run -d --name db training/postgres
$ docker run -d -P --name web --link db:db training/webapp python app.py
--link name:alias
连接后的容器web 是 db 的自容器,不需要暴露给主机端口就可以使父子容器直接打开一个安全连接隧道
Docker在父容器中开放自容器连接信息有两种办法:
- 环境变量
- 更新 /etc/hosts 文件
运行 env查看容器的环境变量
$ docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .
查看hosts信息(可以直接用别名或id连接)
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
172.17.0.5 db
- 添加卷
$ docker run -d -P --name web -v /webapp training/webapp python app.py
可以在Dockerfile中使用 VOLUME 指令添加一个或多个卷
- 挂载一个主机目录到容器
$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
这会将主机目录/src/webapp挂载到容器的/opt/webapp目录
docker默认对数据卷有读写权限,可以通过
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
来做到使数据卷只读
- 持久化docker中的环境变量
$ vi ~/.bashrc
编辑 ~/.bashrc 添加 export 命令