如何 attach(接入)和 detach(脱离)Docker 容器的进程?

docker attach 容器名 把终端接到容器主进程的 stdin/stdout;启用 stdin/TTY 的容器可用 Ctrl+P Ctrl+Q 脱离;按 Ctrl+C 会发 SIGINT 可能停掉进程。本文讲清与 exec 的区别。

最佳实践
如何 attach(接入)和 detach(脱离)Docker 容器的进程?封面

核心用法:docker attach <容器名> 把当前终端接到容器主进程(PID 1)的输入输出上,看到的就是应用实时输出;脱离但让容器继续跑,对启用stdin和TTY的交互容器按 Ctrl+P 再按 Ctrl+Q;Ctrl+C 的信号传递取决于 TTY 和信号代理设置;主进程是否退出取决于信号处理,不能一概而论。

attach 的使用

docker attach myapp

attach查看stdout/stderr不要求-it;能否输入需stdin保持开放,默认detach键序列主要适用于-i和-t启用的容器。

脱离的两种方式

操作 结果
Ctrl+P Ctrl+Q 脱离终端,容器继续运行(推荐)
Ctrl+C 发 SIGINT 给主进程,多数应用退出 → 容器停止

detach 键序列可以在 run 时自定义:--detach-keys "ctrl-x"。

attach vs exec:别用错

这是新手最常混淆的一对:

docker attach docker exec -it 容器 sh
接入对象 容器主进程(PID 1) 新起一个独立进程
退出影响 可能影响主进程,容器停止 通常只退出新进程,但其中命令仍可改文件、发信号并影响应用
典型用途 看应用实时输出、交互式应用 进容器排查、跑临时命令

进容器排查请用 exec,看主进程输出才用 attach——把 attach 当 exec 用导致误停生产容器的事故并不少见。

非交互看输出的更好选择

只想看日志流,别 attach:

docker logs -f myapp          # 跟随输出,随时 Ctrl+C 不伤容器
docker logs --tail 100 myapp

常见问题(FAQ)

Q:attach 上去卡住没反应?
A:主进程不输出或不读 stdin(启动时没带 -it)。先确认交互/TTY与detach支持;仅观察输出可用 docker attach --no-stdin --sig-proxy=false,或改用 logs,避免误把信号送入应用。

Q:Ctrl+P Q 没生效?
A:终端复用器(tmux/screen)或某些 SSH 客户端可能截获按键序列,用 --detach-keys 换一组。

Q:K8s 里等价命令?
A:kubectl attach pod名 -c 容器名,不要假定支持Docker同一detach键序列,应按kubectl版本/TTY设置确认;排查看日志用 kubectl logs -f。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台