计算机系统应用教程网站

网站首页 > 技术文章 正文

「050」Docker:容器的两种运行模式

btikc 2024-10-14 08:46:13 技术文章 7 ℃ 0 评论

这节课我们来介绍一下容器的两种运行模式: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 端口,这属于容器网络相关的内容,我们后面会学习到。然后我们用浏览器访问 localhost127.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 容器的两种运行模式:AttachedDetached。另外,还知道了如何在 Detached 模式下查看或动态跟踪容器日志。如果是临时创建一个容器来使用(比如测试),可以使用 Attached 模式。但大多数情况,我们都是以 Detached 模式运行容器的,所以请记住 run -d 命令。

下节课我们将学习如何与容器进行交互。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表