容器管理
查看容器(ps)
在运行容器之前,我们需要知道如何查看运行中的容器:
1 | # Management Commands(推荐) |
使用此方法只能看到运行中的容器,对于以及停止的容器,还需要使用-a
参数,比如:
1 | docker container ps -a |
容器运行(run, 无参数)
前面有说过,容器是镜像的实例。学习 docker 最终目的就是就是运行它。
1 | docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] |
运行第一个测试容器:
1 | # Management Commands(推荐) |
如图所示:
hello-world 容器是一个测试容器,在输出一些文字之后就会退出,通过这个过程,我们可以发现:
- 对于运行容器,如果镜像不存在,则会去 registry 中自动下载。
- 使用 ps 查看容器的时候,如果不使用 -a 参数是看不到状态属于 Exited 的容器的。
- 使用 ps 可以简单的看到容器的 ID,使用的镜像,执行的命令,创建时间,运行状态,端口,容器的名字等信息。
容器运行(run -d,守护态)
在运行容器时,需要确定这个容器是运行在前台模式还是后台模式。
-d,--detach
,守护态运行。能够将容器运行在后台模式。这样所有的 IO 都只能通过网络资源或存储卷来进行交互。容器不再监听执行 docker run 这个命令行的窗口。有点类似于 Linux 启动程序时候的nohup
或者 &
组合。
1 | docker container run -d hello-world |
如图所示:
可以发现,hello-world 容器加了 -d 参数后不在输出它的信息,只是返回了一长串字符,其实就是完整的 Container ID,用法类似 Image ID。
同时由于 hello-world 容器本身的特性,程序在后台执行完成之后就直接退出了,容器也跟着退出了。
再次运行以 nginx 容器为例:
1 | docker container run nginx |
如图所示:
可以发现以下信息:
- 由于没有跟 TAG,默认会以 latest 版本执行。在 docker 中,如果是运行 latest 版本,docker 都会去仓库试着拉取,而不是直接使用本地的镜像,因为本地的 latest 不一定是真正的 latest。
- 容器在运行之后会以前台模式运行,所有它 hung 在了命令行。
- 此时如果我们新开一个窗口来查看,可以发现容器处于 Up 状态,如下图所示:
- 如果我们去 docker run 的窗口使用 Ctrl + c 中断,然后再次查看容器运行状态,可以发现容器已经退出,这就是前台运行的问题,如图所示:
如果使用后台运行模式运行该容器:
1 | docker container run -d nginx |
运行效果如图所示:
容器被放在了后台运行,不会 hung 在命令行。当然所有的输出信息也不能直接看到了。
容器运行(run -it,交互式运行)
在使用 -d 参数之后,容器就不会 hung 在命令行窗口,而是以后台方式运行。但是这同时也有一个问题,某些时候我们是需要进入容器查看相关启动等信息的。此时就需要另外的参数配合使用:
-i,--interactive
:打开一个交互式界面。-t,--tty
:打开一个 TTY 终端。
将这个两个参数结合就是打开一个交互式的 TTY 终端。
1 | docker container run -it nginx /bin/bash |
如图所示:
通过该方法在创建容器的时候指定运行命令,然后以 bash 进入容器内部的命令行。可以发现:
- 容器内部就是 linux 的目录结构,但是是一个很简化的 linux,很多基础命令都没有。
- 当退出容器命令行,容器也跟着退出。原因是我们重写容器内部的命令为 bash 之后,nginx 就没有启动了,当退出 bash 之后,容器内部就没有进程了,所有容器就退出了。
- 这种方式用的比较少,一般都是容器运行之后,使用专门的命令进入容器。
容器运行(run –name,容器命名)
在创建容器的时候,如果不给容器指定一个名字,容器会生成一个随机的名字,一般都是以 xxx_xxx 的格式。
1 | docker container run -d --name demo01 nginx |
如图所示:
针对容器的名字,我们可以根据自己的需求指定相关的命名规范,以此来实现统一管理的目的。
容器运行(run –rm,退出删除)
某些容器可能是一次性容器,在运行之后,容器退出。同时不保留在 ps 中,此时就需要使用到 --rm
参数。
1 | docker container run --rm --name rm_test hello-world |
如图所示:
容器运行(run –restart,重启规则)
为了保障在以外的停止之后能够自动恢复,就需要对它配置相关--restart
规则:
on-failure
:容器停止时,容器出现报错,则容器会被重启。但是如果 docker 服务被重启了该配置就不会生效。unless-stopped
:容器停止,如果没有报错,则容器会被重启。即使重启了 docker 服务,该配置也生效。always
:不管如何,容器只要停止就重启。
1 | docker container run -d --restart always --name busybox_test busybox /bin/sh -c "sleep 60" |
busybox
镜像是一个精简的 Linux,非常小,适合用来做测试。结果如下:
通过过一段时间查看,发现在容器内部 sleep 60 之后退出,然后被重启拉起一个新的。
以上就是容器运行的基本参数,至于容器的存储卷,网络等内容,后面会单独分节介绍。
查看详情(inspect)
通过该命令可以查看容器的详细信息:
1 | docker container inspect busybox_test |
详细信息中需要关注的点包括:
Image
:使用的镜像。Volumes
:数据存储卷。IPAddress
:容器的 IP 地址。Ports
:端口信息。
状态管理
通过该命令可以查看容器的运行时状态,如 Up,Exited 等:
1 | # 创建容器但不运行 |
结果如图所示
进入容器(attach)
通过该命令可以连接到一个运行中的容器:
1 | docker container attach --sig-proxy=false demo02 |
使用--sig-proxy=false
的目的是为了避免Ctrl + C
或者Ctrl + D
使容器退出。
该命令会对容器进行监听,命令行处于交互式界面,此时从新窗口请求该容器的 nginx:
可以看到日志直接输出到屏幕,Ctrl + C
就可以退出该界面且保持容器继续运行。
进入容器(exec)
上面的方法是将输出直接输出到屏幕上,无法操作,如果想将容器当虚拟机一样使用,则需要 exec:
1 | docker exec -it demo02 /bin/bash |
注意,exec 后面需要跟执行命令,由于是命令行,则需要使用 /bin/bash 或者 /bin/sh。
查看日志(logs)
通过该命令可以实时查看容器运行的日志:
1 | docker container logs -f demo02 |
如图所示:
使用-f
的参数可以让它像linux中的tail
命令一样。否则就是一次性查看,跟cat
一样。
文件拷贝(cp)
通过该命令可以实现容器和宿主机之间文件传输:
1 | # 拷贝文件到容器 |
如图所示:
查看端口(port)
通过该命令可以查看容器和宿主机的端口映射关系:
1 | docker container port demo02 |
查看状态(stats)
通过该命令可以查看容器内部系统资源使用情况:
1 | docker container stats demo02 |
如图所示
查看进程(top)
通过该命令可以查看到容器内部运行的进程:
1 | docker container top demo02 |
如图所示
提交镜像(commit)
该命令可以将现有的容器提交成镜像:
1 | docker container commit -a "Trover <admin@buerya.cn>" -m "Copy file" -p demo02 trover/nginx-copy-file:v1.0 |
参数说明:
-a
:作者信息。-m
:提交信息,有点像git commit -m
。-p
:生成镜像时容器暂停。
如图所示:
停止容器(kill)
该命令相较于 stop 更暴力杀死一个或多个容器:
1 | docker container kill demo02 |
如图所示:
重命名容器(rename)
该命令可以对容器重命名:
1 | docker container rename demo02 demo03 |
如图所示:
导出容器(export)
该命令可以将容器当前的状态导出:
1 | docker container export -o /tmp/demo03.tar demo03 |
如图所示:
查看系统变化(diff)
该命令可以查看容器目前的文件和文件系统本身的差异:
1 | docker container diff demo03 |
如图所示:
删除容器(rm)
该命令可以删除指定的一个或多个容器:
1 | # 删除停止的容器 |
如果容器在运行,需要使用-f
强制删除:
批量删除(rm)
对于容器或者镜像,都可以使用条件筛选的方式对它进行批量删除:
1 | # 删除所有容器 |
使用-q
参数能够增加筛选条件。
删除容器(prune)
该命令可以删除没有使用的容器:
1 | docker container prune |
可以通过-f
参数直接删除,不用确认。
到此,容器的大部分操作都已经体验完毕。接下来将讲解如何制作镜像!