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

时间:2014-03-08 17:10:21

标签: docker

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

  • 附上tty
  • 附上std-in和std-out

出于这些目的,我发现使用了-i-t标记。

这个过程意味着什么?

4 个答案:

答案 0 :(得分:24)

stdin, stdout, and ttys是相关概念。 stdinstdout是进程的输入和输出流。 pseudo terminal(也称为ttypts)通常会(但不一定)将用户的“终端”与stdinstdout流相关联)通过诸如bash之类的shell。我在“终端”周围使用引号,因为我们今天真的不使用同样意义上的终端。

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

code docker uses to attach stdout/stdin包含所有脏信息。

答案 1 :(得分:9)

我们可以使用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将为所有正在运行的进程打印打开的文件。您应该在其输出中看到三个进程(sleep,bash和lsof本身)。

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

请注意我们在没有-t选项的情况下启动的sleep进程如何为stdinstdoutstderr提供三个FIFO管道:

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

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

docker exec -it tty-test /bin/bash
然后我们可以注意到两件事。首先,我们现在没有从bash获得shell提示符,但我们仍然可以键入命令并查看其输出。当我们运行lsof时,我们发现bash进程现在还有管道而不是tty附加到stdinstdoutstderr

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

答案 2 :(得分:3)

这意味着您可以使用TTY(即终端)登录您的容器。就好像你面前有一台Linux机器,你正在登录它。如果您的容器没有运行SSH服务器或telnet,这是进入命令行提示符的唯一模式。

至于为什么-i-t是我不确定的不同参数,我无法想象你想要使用TTY连接并且不想要stdin / stdout的场景选项,反之亦然。

答案 3 :(得分:0)

简单地说它允许我们从集装箱码头上卸下和拆卸。要附加我们使用docker attach命令并分离我们使用CTRL + P& CTRL + Q命令。