docker 所有容器的状态(050Docker容器的两种运行模式)
这节课我们来介绍一下容器的两种运行模式:Attached 模式和 Detached 模式,接下来我们就来聊聊关于docker 所有容器的状态?以下内容大家不妨参考一二希望能帮到您!
docker 所有容器的状态
这节课我们来介绍一下容器的两种运行模式:Attached 模式和 Detached 模式。
在介绍两种模式之前,我们先使用下面的命令创建一个容器:
PS C:\Users\Liam> Docker container run -p 80:80 nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
这里我们加了一个 -p 参数,表示把容器内部的 80 端口映射到外部 80 端口,这属于容器网络相关的内容,我们后面会学习到。然后我们用浏览器访问 localhost 或 127.0.0.1 则可以看到 nginx 网面。
注意:如果你本地的 80 端口已被占用,请使用其它端口。
Attached 模式上面创建 nginx 容器后,可以看到,它实际执行的是一个名为 /docker-entrypoint.sh 入口脚本,并进入了交互模式。也就是说,它会随着终端会话的关闭而终止,并且能实时看到容器打印的日志。比如,我们用浏览器访问 localhost,我们访问的是该容器的 nginx 服务器,此时我们在终端可以看到 nginx 输出的日志:
172.17.0.1 - - [11/Apr/2022:08:55:58 0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.36" "-"
2022/04/11 08:55:58 [error] 32#32: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost", referrer: "http://localhost/"
注意:Linux 可以通过 Ctrl C 关闭命令行交互会话,但在 Windows 中的 Ctrl C 无法结束 Docker 容器会话,要关闭会话需要关闭终端。
此时,当我们关闭命令行终端会话时,再查看一下容器状态:
PS C:\Users\Liam> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
PS C:\Users\Liam>
可以看到容器已经停止了,可以理解为它在前台运行。也就是说,Docker 容器的输入输出会 Attach 到我们本地机器的命令行终端,我们在本地终端的输入也会反映到容器内部。这种前端运行的方式我们称之为 Attached 模式。
Detached 模式相应地,Detached 模式可以理解为进程在后台运行,也就是说终端会话关闭后,不会影响到正在运行容器。那如何以 Detached 模式运行容器呢?
我们先使用下面的命令把上面创建的容器强制删除:
PS C:\Users\Liam> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31c8f39bcede nginx "/docker-entrypoint.…"33 minutes ago Exited (0) 11 minutes ago elastic_gagarin
PS C:\Users\Liam> docker rm -f 31
31
要使容器以 Detached 模式运行,只要在创建容器时加个 -d (或 --detach)参数就行,如下:
PS C:\Users\Liam> docker container run -d -p 80:80 nginx
d878beae5ceaaa9f4aff722335df0c9e3710fdb0c26bd169a6558cc75ed2fea3
和之前不同的是,这次除了容器 ID,并没有其它的日志输出。我们可以看一下我们刚创建的这个容器状态:
PS C:\Users\Liam> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d878beae5cea nginx "/docker-entrypoint.…"1 minutes ago Up 1 minutes 0.0.0.0:80->80/tcp heuristic_cohen
容器是运行中的,我们还可以通过访问 localhost 我们可以看到 nginx 响应的页面,但是不能像前面一样在终端看到 nginx 日志。
Detached 切换为 Attached那如何将后台运行的容器 Attach 到前台呢?这时候可以使用 attach 命令,比如:
PS C:\Users\Liam> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d878beae5cea nginx "/docker-entrypoint.…"1 minutes ago Up 1 minutes 0.0.0.0:80->80/tcp heuristic_cohen
PS C:\Users\Liam> docker attach d87
此时再使用浏览器访问 localhost,就又可以看到 nginx 的输出日志了。
这里其实是把 Detached 模式切换为 Attached 模式了,所以当我们结束终端会话时,容器也会停止。
除了临时创建一个容器我们会用到 Attached 模式,大多数情况我们都会使用 Detached 模式运行容器。所以,我们一般不推荐在创建容器的时候使用 attach 命令。
那在 Detached 模式下,如何保持 Detached 状态的情况下查看容器的日志呢?
Detached 模式下查看日志除了上面介绍的不推荐使用的 attach 查看容器日志,还可以通过 logs 交互命令可以查看指定容器输出的日志,比如:
PS C:\Users\Liam> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1049026c094 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp upbeat_matsumoto
PS C:\Users\Liam> docker logs f10
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
...
另外,我们还可以加一个 -f 参数来动态地跟踪日志:
docker container logs -f f10
然后可以使用 Ctrl C 退出日志的跟踪交互,容器依然会是 Detached 运行状态。
小结相信大家已经理解了 Docker 容器的两种运行模式:Attached 和 Detached。另外,还知道了如何在 Detached 模式下查看或动态跟踪容器日志。如果是临时创建一个容器来使用(比如测试),可以使用 Attached 模式。但大多数情况,我们都是以 Detached 模式运行容器的,所以请记住 run -d 命令。
下节课我们将学习如何与容器进行交互。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com