1. 概述

在使用 Docker 容器时,我们经常需要以交互模式运行它。这是我们将终端的标准输入、输出或错误流附加到容器的地方。

通常我们更喜欢在后台运行容器。但是,我们可能希望稍后连接到它以检查其输出或错误或断开会话。

在这篇短文中,我们将学习一些有用的命令来实现这些目标。我们还将看到在不停止容器的情况下从会话中分离的不同方法。

2. 以附加/分离模式运行容器

让我们看看如何在附加或分离模式下运行容器。

2.1.默认模式

默认情况下,Docker 在前台运行一个容器:

$ docker run --name test_redis -p 6379:6379 redis

这意味着在该过程完成之前我们无法返回到 shell 提示符。

上面的命令将标准输出( 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 shell 的标准输入流 (stdin) 附加到容器中, -t 选项为进程分配一个伪终端。这让我们可以 从终端与容器进行交互。

2.3.分离模式

我们使用 -d 选项以分离模式运行容器:

$ docker run -d --name test_redis -p 6379:6379 redis

此命令启动容器,打印其 id,然后返回到 shell 提示符。因此, 我们可以在容器继续在后台运行的同时继续执行其他任务。

稍后我们可以使用其名称或容器 ID 连接到该容器。

3. 与正在运行的容器交互

3.1.执行命令

执行命令允许我们在已经运行的容器内执行命令

$ 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 来达到此目的。它针对键 anotherKey 设置值 100,但不显示命令的输出。

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 容器。

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