整理一下Docker常用的命令
Contents
镜像(Images)
获取镜像
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker Hub。
仓库名:这里的仓库名是两段式名称,既 <用户名>/<软件名> 。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。
运行镜像
docker run -it --rm ubuntu:14.04 bash
docker run 就是使用镜像为基础启动一个容器的命令,参数的意义如下:
-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
–rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。
ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。
bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。
列出镜像
docker images
-a 此参数会显示出所有的镜像,包括中间层镜像
-q 此参数将只显示image的ID
-f –filter 这个参数可以指定显示的镜像类型,例如docker images -f since=mongo:3.2则显示在mongo:3.2后建立的镜像
-format 这个参数可以按照自己想要的格式输出镜像信息。参照Go语言模板语法就可以生成自己想要的列表
创建镜像
sudo docker commit -m "提交信息" -a "用户信息" [容器ID] [标签]
例如:
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。
保存和加载镜像
保存镜像
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
加载镜像
sudo docker load --input ubuntu_14.04.tar
或
sudo docker load < ubuntu_14.04.tar
移除本地镜像
docker rmi
Tips:清理所有未打过标签的本地镜像
sudo docker rmi $(docker images -q -f "dangling=true")
容器(Container)
新建并启动容器
$ sudo docker run -t -i --rm ubuntu:14.04 /bin/bash
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;
-i 则让容器的标准输入保持打开;
–rm 表示容器运行完成立即销毁。
启动已终止容器
docker start <Container>
后台(background)运行
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
如果使用了 -d 参数运行容器。此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息
终止容器
docker stop <Container>
处于终止状态的容器,可以通过 docker start 命令来重新启动。
此外, docker restart 命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
对于进入后台运行的容器可以用两种方式进入:
1.attach
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17seconds nostalgic_hypatia $sudo docker attach nostalgic_hypatia root@243c32535da7:/#
但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2.nsenter
首先找到容器的第一个进程PID
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通过这个 PID,就可以连接到这个容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17seconds nostalgic_hypatia $ PID=$(docker-pid 243c32535da7) 10981 $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid root@243c32535da7:/#
导出和导入容器
导出容器
通过 docker export 命令。
$ sudo docker export 7691a814370e > ubuntu.tar
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3MB
此外,也可以通过指定 URL 或者某个目录来导入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
仓库
通过docker search可以搜索镜像
sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2860 [OK] jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 47 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 18 [OK] gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 14 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] egyptianbman/docker-centos-nginx-php A simple and highly configurable docker co... 6 [OK] nathonfowlie/centos-jre Latest CentOS image with the JRE pre-insta... 5 [OK] centos/mariadb55-centos7 3 [OK] ...
Docker 数据管理
数据卷(Data volumes)
创建一个数据卷
docker run使用-v参数创建并且挂载数据卷到容器中。一次docker run可以挂载多个数据卷
创建一个名为 web 的容器,并加载一个数据卷到容器的 /webapp 目录。
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
查看数据卷的具体信息
$ sudo docker inspect web
在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的 /var/lib/docker/volumes/ 下面的
"Mounts": [ { "Name": "3274d36dddf9a47468e2c90283d2ff6caa405b69e13dff776a11c7cfab66d30b", "Source": "/var/lib/docker/volumes/3274d36dddf9a47468e2c90283d2ff6caa405b69e13dff776a11c7cfab66d30b/_data", "Destination": "/webapp", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }
删除数据卷
数据卷的生命周期是独立于容器的,就算删除容器也不会自动删除数据卷,同时,无主(容器被删除)的数据卷会占用很大空间,且清理比较麻烦。因此如果要移除数据卷,应该在停止当前容器之后,删除容器之前。
注:docker volume ls可以用来列出主机上剩余的数据卷,docker volume rm 可以删除数据卷
docker rm -v <Container>
挂载一个主机目录作为数据卷
使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
挂载一个本地主机文件作为数据卷
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
数据卷容器(Data volume containers)
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
1.创建数据卷容器
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
2.调用数据卷
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
–volumes-from可以使用多次来指定从多个容器挂载不同的数据卷,同时可以从已经挂载数据卷的容器中级联挂载数据卷。
利用数据卷容器来备份、恢复、迁移数据卷
备份
首先使用 –volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。
注:虽然其实这里是将容器中/dbdata挂载点映射到了主机/var/lib/docker/volumes/路径下,但是按照docker的思路,仍然应该通过容器对数据卷进行操作。
恢复
如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
Docker网络
外部访问容器
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
$ sudo docker run -d -P training/webapp python app.py $ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f765f8facca training/webapp "python app.py" 18 seconds ago Up 17 seconds 0.0.0.0:32768->5000/tcp amazing_ardinghelli
-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。
映射所有接口地址
使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ docker port nostalgic_morse 5000 127.0.0.1:49155.
-p 标记可以使用多次来绑定多个端口
Source:https://www.gitbook.com/book/yeasy/docker_practice/details