1. 概述
在使用 Docker 容器时,我们经常需要以交互模式运行它。这意味着我们将终端的标准输入、输出或错误流附加到容器上。
通常我们希望在后台运行容器。然而,我们可能希望稍后连接到它以检查输出或错误,或者断开会话。
在这篇简短的文章中,我们将学习一些有用的命令来实现这些目标。我们还将看到在不关闭容器的情况下从会话中脱机的不同方式。
2. 在附加或脱机模式下运行容器
让我们看看如何使用 run
命令以附加或脱机模式运行容器。
2.1. 默认模式
默认情况下,Docker 以前台模式运行容器:
$ docker run --name test_redis -p 6379:6379 redis
这意味着我们只有在进程结束时才能返回到命令行提示符。
上面的命令将标准输出(stdout
)和标准错误(stderr
)流与我们的终端关联起来。因此,我们可以看到容器控制台输出在我们的终端中。
–name
选项给容器一个名称。我们可以在其他命令中稍后使用相同的名称来引用此容器。或者,我们可以使用执行 docker ps
命令时获取的容器 ID 来引用它。
我们还可以使用 -a
选项选择从 stdin、stdout 和 stderr 连接到的特定流:
$ docker run --name test_redis -a STDERR -p 6379:6379 redis
上述命令意味着我们 仅能看到来自容器的错误消息。
2.2. 交互模式
我们通过一起使用 -i
和 -t
选项启动容器以交互模式:
$ docker run -it ubuntu /bin/bash
这里的 -i
选项将容器中 bash 壳的标准输入流(stdin)与我们的终端关联,并且 -t
选项为进程分配了一个伪终端。这使我们 可以从终端与容器进行交互。
2.3. 脱机模式
我们使用 -d
选项以脱机模式运行容器:
$ docker run -d --name test_redis -p 6379:6379 redis
此命令启动容器、打印其 ID 然后返回到命令行提示符。因此,我们可以在容器继续在后台运行的同时继续执行其他任务。
稍后,我们可以通过容器的名称或容器 ID 来连接到此容器。
3. 与正在运行的容器互动
3.1. 执行命令
exec
命令允许我们在已运行的容器中执行命令,这是使用 execute 命令实现的:
$ docker exec -it test_redis redis-cli
此命令在名为 test_redis
的已运行 Redis 容器中打开 redis-cli
会话。我们也可以使用容器 ID 而非名称。如第 2.2 节所述,-it
选项启用交互模式。
然而,我们可能只想要针对键获取值:
$ docker exec test_redis redis-cli get mykey
此命令在 redis-cli
中执行 get
命令,返回键 mykey
的值,并关闭会话。
还可以在后台执行命令:
$ docker exec -d test_redis redis-cli set anotherkey 100
在这里,我们使用 -d
目的。它将值设置为 100 对应于键 anotherKey
,但不会显示命令的输出。
3.2. 连接会话
attach
命令将我们的终端连接到正在运行的容器:
$ docker attach test_redis
默认情况下,命令将标准输入、输出或错误流与主机 shell 绑定。
要仅查看输出和错误消息,我们可以通过 –no-stdin
选项省略 stdin
:
$ docker attach --no-stdin test_redis
4. 从容器中脱机
从 Docker 容器中脱机的方式取决于其运行模式。
4.1. 默认模式
按下 CTRL-c 是终止会话的常见方法。但如果我们在没有使用 -d
或 -it
选项启动容器时,**CTRL-c
命令会停止容器而不是断开连接**。会话传播 CTRL-c
即 SIGINT
信号到容器并杀死其主进程。
让我们通过传递 –sig-proxy=false
来覆盖此行为:
$ docker run --name test_redis --sig-proxy=false -p 6379:6379 redis
现在,我们可以按下 CTRL-c
只断开当前会话,而容器继续在后台运行。
4.2. 交互模式
在这种模式下,CTRL-c
作为交互会话的命令,因此它不能作为脱机键使用。这里,我们应该使用 CTRL-p CTRL-q
结束会话。
4.3. 后台模式
在这种情况下,我们需要 在连接会话时覆盖 –sig-proxy
值:
$ docker attach --sig-proxy=false test_redis
我们还可以通过 –detach-keys
选项定义单独的键:
$ docker attach --detach-keys="ctrl-x" test_redis
这将脱离容器并在按下 CTRL-x
时返回提示符。
5. 总结
在本文中,我们看到了如何以附加和脱机模式启动 Docker 容器。
然后,我们研究了用于开始或结束与活跃容器会话的一些命令。