操作 Docker 容器
容器是docker 的核心概念,容器是一个或一组独立运行的应用,以及它们的运行环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
1.启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped
)的容器重新启动。
2.新建并启动
所需要的命令主要为 docker run
。
新建并启动
Unable to find image 'ubuntu:18.04' locally 18.04: Pulling from library/ubuntu 6abc03819f3e: Pulling fs layer 6abc03819f3e: Pull complete 05731e63f211: Pull complete 0bd67c50d6be: Pull complete Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5 Status: Downloaded newer image for ubuntu:18.04 root@71f93fa546e3:/# root@71f93fa546e3:/# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 10 pts/0 00:00:00 ps root@71f93fa546e3:/#
其中,-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i
则让容器的标准输入保持打开。
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
启动已终止容器
可以利用 docker container start
命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps
或 top
来查看进程信息。
root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 71f93fa546e3 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes silly_gauss 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker container ls
后台运行
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d
参数来实现。
下面举两个例子来说明一下。
如果不使用 -d
参数运行容器。
[root@localhost ~]# docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" hello world hello world hello world hello world hello world hello world hello world hello world hello world ^C[root@localhost ~]# ^C [root@localhost ~]# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05 [root@localhost ~]# [root@localhost ~]#
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs
查看)。
[root@localhost ~]# docker container logs 68dd6ebc3dd6 hello world hello world hello world hello world hello world hello world hello world
注: 容器是否会长久运行,是和 docker run
指定的命令有关,和 -d
参数无关。
使用 -d
参数启动后会返回一个唯一的 id,也可以通过 docker container ls
命令来查看容器信息。
[root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker container start 68dd6ebc3dd6 68dd6ebc3dd6 [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" 3 minutes ago Up 2 seconds angry_haslett 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker container stop 68dd6ebc3dd6 68dd6ebc3dd6 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 31 minutes ago Up 31 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]#
终止容器
可以使用 docker container stop
来终止一个运行中的容器。
此外,当 Docker 容器中指定的应用终结时,容器也自动终止。
例如对于上一章节中只启动了一个终端的容器,用户通过 exit
命令或 Ctrl+d
来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 docker container ls -a
命令看到。例如
[root@localhost ~]# docker container ls #列出活动的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 34 minutes ago Up 34 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# [root@localhost ~]# docker container ls -a #列出所有容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" 7 minutes ago Exited (137) 3 minutes ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" 7 minutes ago Exited (0) 7 minutes ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" 17 minutes ago Exited (0) 8 minutes ago silly_gauss 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 34 minutes ago Up 34 minutes 0.0.0.0:4000->80/tcp priceless_borg 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 4 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost ~]#
处于终止状态的容器,可以通过 docker container start
命令来重新启动。
此外,docker container restart
命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
在使用 -d
参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,包括使用 docker attach
命令或 docker exec
命令,推荐大家使用 docker exec
命令,原因会在下面说明。
attach
命令
[root@localhost ~]# docker run -dit ubuntu 5da48ce5974710e5bcc173a889d992983b8eb0365cb55210e678d72debfa0553 [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5da48ce59747 ubuntu "/bin/bash" 7 seconds ago Up 5 seconds heuristic_taussig 756e0df1467d ubuntu "/bin/bash" About a minute ago Up About a minute nifty_shamir e958909dcdc4 ubuntu "/bin/bash" About a minute ago Up About a minute vigorous_hypatia 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker attach 5da4 root@5da48ce59747:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@5da48ce59747:/# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 11 pts/0 00:00:00 ps root@5da48ce59747:/#
#注意: 如果从这个 stdin 中 exit,会导致容器的停止。
exec
命令
-i -t 参数
docker exec
后边可以跟多个参数,这里主要说明 -i
-t
参数。
只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
[root@localhost ~]# docker exec -i 756e bash #不显示登录终端 df Filesystem 1K-blocks Used Available Use% Mounted on overlay 9959424 2368420 7591004 24% / tmpfs 65536 0 65536 0% /dev tmpfs 498980 0 498980 0% /sys/fs/cgroup /dev/mapper/centos-root 9959424 2368420 7591004 24% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 498980 0 498980 0% /proc/asound tmpfs 498980 0 498980 0% /proc/acpi tmpfs 498980 0 498980 0% /proc/scsi tmpfs 498980 0 498980 0% /sys/firmware exit [root@localhost ~]# docker exec -it 756e bash #显示登录终端 root@756e0df1467d:/# df Filesystem 1K-blocks Used Available Use% Mounted on overlay 9959424 2368420 7591004 24% / tmpfs 65536 0 65536 0% /dev tmpfs 498980 0 498980 0% /sys/fs/cgroup /dev/mapper/centos-root 9959424 2368420 7591004 24% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 498980 0 498980 0% /proc/asound tmpfs 498980 0 498980 0% /proc/acpi tmpfs 498980 0 498980 0% /proc/scsi tmpfs 498980 0 498980 0% /sys/firmware root@756e0df1467d:/#
如果从这个 stdin 中 exit,不会导致容器的停止。这就是为什么推荐大家使用 docker exec
的原因。
更多参数说明请使用 docker exec --help
查看。
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export
命令。
[root@localhost ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b176a3a61d5 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 17 minutes ago Up 17 minutes 0.0.0.0:4000->80/tcp xenodochial_mcclintock 5da48ce59747 ubuntu "/bin/bash" 18 minutes ago Exited (0) 14 minutes ago heuristic_taussig 756e0df1467d ubuntu "/bin/bash" 19 minutes ago Exited (0) 4 minutes ago nifty_shamir e958909dcdc4 ubuntu "/bin/bash" 19 minutes ago Up 19 minutes vigorous_hypatia 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (137) 44 minutes ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (0) About an hour ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" About an hour ago Exited (0) About an hour ago silly_gauss 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 5 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost ~]# docker export 5da > ubuntu.tar [root@localhost ~]# ls anaconda-ks.cfg ubuntu.tar [root@localhost ~]# ll ubuntu.tar -rw-r--r-- 1 root root 72332800 May 27 03:37 ubuntu.tar [root@localhost ~]# #导出容器快照到本地文件
导入容器快照
可以使用 docker import
从容器快照文件中再导入为镜像,例如
[root@localhost ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0 sha256:fe4eda56cd374133a7f3a6ce6b12bc13d26fe78a5083f63171ecfbd5b005dead [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 fe4eda56cd37 13 seconds ago 69.9MB ubuntu 18.04 7698f282e524 11 days ago 69.9MB ubuntu latest 7698f282e524 11 days ago 69.9MB dockerpracticecn/docker_practice latest b6bfd54275de 13 days ago 41.8MB nginx latest 53f3fd8007f7 2 weeks ago 109MB iganarix/base-ubuntu-18.04 latest 0ffa5d899369 5 weeks ago 558MB progrium/busybox latest a67699e37dbd 7 months ago 4.8MB [root@localhost ~]#
注:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用 docker container rm
来删除一个处于终止状态的容器。例如
[root@localhost /]# docker container rm 5da4 5da4 [root@localhost /]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b176a3a61d5 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 42 minutes ago Up 42 minutes 0.0.0.0:4000->80/tcp xenodochial_mcclintock 756e0df1467d ubuntu "/bin/bash" 44 minutes ago Exited (0) 30 minutes ago nifty_shamir e958909dcdc4 ubuntu "/bin/bash" 45 minutes ago Up 45 minutes vigorous_hypatia 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (137) About an hour ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (0) About an hour ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" About an hour ago Exited (0) About an hour ago silly_gauss 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 5 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost /]#
清理所有处于终止状态的容器
用 docker container ls -a
命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
[root@localhost /]# docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y Deleted Containers: 756e0df1467d54351555c9cd43f061ef653b506b7b9b67b8a320b1398f071a24 68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05 74d05a9b6bfd2d6e1bed801b030d2d2c0005096c91f2566fc3ad02ee6117f254 71f93fa546e30f0b6da59015feda84c6d18a0a92fae92984649f196e9ce38a89 6603c0996cb7caae8b8f54900239e2c3f02ec01b23a6c17708739caa0bc5bbfe 785c1b8f6469b44dde63fe153c1888ec927c36bfc29f4d84f58ecf104ab273b7 517422f3ebb2a0b81e1e0fc056caafaee8f886236176cdcbd5aac5d90c044aea a14868c3b1ec6901f45987ddd2919675b9aa3ee117402a1b2a73ec49d3572dbf Total reclaimed space: 82B [root@localhost /]#