将 tty/std-in-out 附加到 docker 或 lxc 是什么意思?

新手上路,请多包涵

我阅读了一些 docker 文档,但我不明白这可能意味着什么

  • 附加一个 tty
  • 附加标准输入和标准输出

出于这些目的,我看到使用了 -i-t 标志。

这个过程是什么意思?

原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
2 个回答

stdin, stdout, and ttys 是相关概念。 stdinstdout 是一个进程的输入输出流。 A pseudo terminal (also known as a tty or a pts ) connects a user’s “terminal” with the stdin and stdout stream,通常(但不一定)通过诸如 bash 类的外壳。我在“终端”周围使用引号,因为我们今天真的不使用同样意义上的终端。

在 docker 的情况下,当您以交互模式运行进程时,例如启动 bash shell 时,您经常会同时使用 -t-i 。对于 shell,您希望能够发出命令并读取输出。

docker 用来附加的代码 stdout/stdin 包含所有脏细节。

原文由 Ben Whaley 发布,翻译遵循 CC BY-SA 4.0 许可协议

通过使用 lsof 命令,我们可以看到幕后发生的事情。作为演示,我们可以从只运行 sleep 的 Debian 映像创建一个简单的 docker 容器:

 docker run -d --name tty-test debian /bin/bash -c "sleep 1000"

这将在新容器中启动 sleep 命令(请注意,我们没有使用 -i-t )。

接下来,我们通过 exec 命令“登录”到我们的容器并启动 bash:

 docker exec -it tty-test /bin/bash

一个普通的 debian 镜像不会安装 lsof 所以我们需要安装它:

 apt update && apt install -y lsof

接下来我们运行 lsof:

 lsof

如果不带任何选项运行, lsof 将打印所有正在运行的进程的打开文件。您应该在其输出中看到三个进程(睡眠、bash 和 lsof 本身)。

以下是显示文件描述符(FD 列)的相关行 02

Note how the sleep process, which we started without the -t option has three FIFO pipes for stdin , stdout and stderr :

 sleep     1 root    0r  FIFO   0,10      0t0 8226490 pipe
sleep     1 root    1w  FIFO   0,10      0t0 8226491 pipe
sleep     1 root    2w  FIFO   0,10      0t0 8226492 pipe

虽然 bash 进程有一个实际设备连接到 stdinstdoutstderr

 bash      7 root    0u   CHR 136,15      0t0      18 /dev/pts/15
bash      7 root    1u   CHR 136,15      0t0      18 /dev/pts/15
bash      7 root    2u   CHR 136,15      0t0      18 /dev/pts/15

让我们使用 -t 选项创建另一个容器:

 docker run -d -t --name tty-test2 debian /bin/bash -c "sleep 1000"

再次安装 lsof 后(见上文)我们从 lsof 得到不同的输出 sleep 进程:

 sleep     1 root    0u   CHR 136,15      0t0      18 /15
sleep     1 root    1u   CHR 136,15      0t0      18 /15
sleep     1 root    2u   CHR 136,15      0t0      18 /15

请注意类型列如何更改为 CHR 并且名称列显示 /15

最后,当我们从 exec 命令中省略 -t 选项时,如下所示:

 docker exec -it tty-test /bin/bash

然后我们可以注意到两件事。首先,我们现在没有从 bash 获得 shell 提示,但我们仍然可以键入命令并查看它们的输出。 When we run lsof we see that the bash process now also has pipes rather then a tty attached to stdin , stdout , and stderr

 bash    379 root    0r  FIFO   0,10      0t0 8263037 pipe
bash    379 root    1w  FIFO   0,10      0t0 8263038 pipe
bash    379 root    2w  FIFO   0,10      0t0 8263039 pipe

原文由 lanoxx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进