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-cSIGINT 信号到容器并杀死其主进程。

让我们通过传递 –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 容器。

然后,我们研究了用于开始或结束与活跃容器会话的一些命令。