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-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 容器。
然后,我们研究了一些用于启动或结束与活动容器的会话的命令。