我读了一些docker文档,我不明白它可能意味着什么
出于这些目的,我发现使用了-i
和-t
标记。
这个过程意味着什么?
答案 0 :(得分:24)
stdin, stdout, and ttys
是相关概念。 stdin
和stdout
是进程的输入和输出流。 pseudo terminal(也称为tty
或pts
)通常会(但不一定)将用户的“终端”与stdin
和stdout
流相关联)通过诸如bash
之类的shell。我在“终端”周围使用引号,因为我们今天真的不使用同样意义上的终端。
对于docker,当您以交互模式运行进程时,例如启动-t
shell时,通常会同时使用-i
和bash
。对于shell,您希望能够发出命令并读取输出。
答案 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列)0
到2
的相关行。
请注意我们在没有-t选项的情况下启动的sleep
进程如何为stdin
,stdout
和stderr
提供三个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
进程的实际设备已附加到stdin
,stdout
和stderr
:
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附加到stdin
,stdout
和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
答案 2 :(得分:3)
这意味着您可以使用TTY(即终端)登录您的容器。就好像你面前有一台Linux机器,你正在登录它。如果您的容器没有运行SSH服务器或telnet,这是进入命令行提示符的唯一模式。
至于为什么-i
和-t
是我不确定的不同参数,我无法想象你想要使用TTY连接并且不想要stdin / stdout的场景选项,反之亦然。
答案 3 :(得分:0)
简单地说它允许我们从集装箱码头上卸下和拆卸。要附加我们使用docker attach命令并分离我们使用CTRL + P& CTRL + Q命令。