docker attach¶
docker attach
命令用于连接到一个正在运行的容器,并允许用户与容器的标准输入、输出和错误流进行交互。通过该命令,用户可以实时查看容器的输出,并向容器发送输入。
注意:
这是一个早期的连接/登录容器的命令,建议使用新的容器登录连接命令
docker exec
替代。
docker attach
使用容器的 ID 或名称将终端的标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)(或这三者的任意组合)附加到正在运行的容器上。这使您可以查看其正在进行的输出或以交互方式控制它,就像命令直接在您的终端中运行一样,即登录正在运行的容器。
该 attach 命令将显示 ENTRYPOINT/CMD 进程的输出。终端屏幕会输出覆盖,和在 shell 命令行屏幕输出 Critical 硬件告警异常类似,此时依旧可以输入命令控制容器。
您可以从 Docker 主机上的不同终端会话同时多次附加到相同的容器。当有多个终端同时连接时,输入输出会在多个终端进行同步,类似屏幕共享。
要停止容器,请使用CTRL-c
。该快捷键发送 SIGKILL 信号到容器主进程。如果 --sig-proxy
设置为 true(默认值),则将CTRL-c
发送 SIGINT 到容器。您可以使用CTRL-p CTRL-q
快捷键从容器中分离并使其继续运行 。
注意:
Linux 会特别处理在容器内 PID 1 运行的进程:它会忽略具有默认操作的任何信号。因此,该过程将不会终止,SIGINT 或者 SIGTERM 除非被编码为终止该过程。
使用 docker attach
将客户端连接到容器的 STDIO 时,Docker 使用约 1MB 的内存缓冲区来最大化应用程序的吞吐量。如果此缓冲区已满,则 API 连接的速度将开始对进程输出的写入速度产生影响。这类似于 SSH 之类的其他应用程序。因此,不建议 attach 到容器里面查看类似 log 的输出,建议使用 docker logs
的方式查看。
容器退出时使用的快捷键可能和其他应用配置的产生冲突,用户可以定制自己的 attach 后退出的快捷键。可以在容器运行前覆盖原有的退出快捷键,或者添加到配置文件中。
在执行 docker attach
时配置--detach-keys="<sequence>"
选项可以设置退出时的快捷键。这里的<sequence>
是可以是[a-Z]
里面的内容。或者使用Ctrl +
以下组合
- a-z (单个小写字母字符)
- @ (在标志处)
- [ (左括号)
- \\ (两个反斜杠)
- _ (下划线)
- ^ (插入符号)
例如 a
,ctrl-a
,X
,或ctrl-\\
的退出组合都是合法的。
帮助¶
$ docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach local standard input, output, and error streams to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
选项¶
名称,简写 | 默认值 | 描述 |
---|---|---|
--detach-keys | - | 指定 attach 退出时的快捷键 |
--no-stdin | - | 不要附上 STDIN |
--sig-proxy | true | 代理所有接收到的信号到进程 |
使用场景¶
docker attach
命令在以下场景中非常有用:
- 调试容器:实时查看容器运行中的日志输出,方便排查问题。
- 与容器内交互式应用程序交互:在容器内执行命令,进行文件编辑、配置修改等操作。
- 容器控制:向容器发送信号,例如终止进程等。
使用技巧¶
- 使用
--sig-proxy=false
参数:避免将信号传递给容器进程。 - 使用
Ctrl+p Ctrl+q
组合键:退出docker attach
而不停止容器。 - 结合
docker logs
命令:查看容器的历史日志。
示例¶
登录一个运行中的容器¶
$ docker run -d --name topdemo ubuntu /usr/bin/top -b
$ docker attach topdemo
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355560k used, 18012k free, 27872k buffers
Swap: 786428k total, 0k used, 786428k free, 221740k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 17200 1116 912 R 0 0.3 0:00.03 top
top - 02:05:55 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355244k used, 18328k free, 27872k buffers
Swap: 786428k total, 0k used, 786428k free, 221776k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top
top - 02:05:58 up 3:06, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.3%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355780k used, 17792k free, 27880k buffers
Swap: 786428k total, 0k used, 786428k free, 221776k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top
^C$
$ echo $?
0
$ docker ps -a | grep topdemo
7998ac8581f9 ubuntu:14.04 "/usr/bin/top -b" 38 seconds ago Exited (0) 21 seconds ago topdemo
查看bash的退出码¶
可以看到该 bash 过程返回的退出代码也由 docker attach
命令返回给其调用者
$ docker run --name test -d -it debian
275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab
$ docker attach test
root@f38c87f2a42d:/# exit 13
exit
$ echo $?
13
$ docker ps -a | grep test
275c44472aeb debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test