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

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

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

核心用法:docker attach <容器名> 把当前终端接到容器主进程(PID 1)的输入输出上,看到的就是应用实时输出;脱离但让容器继续跑,按 Ctrl+P 再按 Ctrl+Q;直接 Ctrl+C 会把 SIGINT 发给主进程,多数应用会因此退出、容器停止。

attach 的使用

docker attach myapp

前提:容器启动时分配了交互通道(docker run -it-a stdin,stdout),否则 attach 上去可能看不到输出也无法输入。

脱离的两种方式

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

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

attach vs exec:别用错

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

docker attach docker exec -it 容器 sh
接入对象 容器主进程(PID 1) 新起一个独立进程
退出影响 可能影响主进程,容器停止 只退出 shell,容器无恙
典型用途 看应用实时输出、交互式应用 进容器排查、跑临时命令

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

非交互看输出的更好选择

只想看日志流,别 attach:

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

观测云对照

线上容器不该靠 attach 看输出。 容器 stdout/stderr 由 DataKit 采集后,在日志查看器里实时跟随、检索、告警,多人同时看互不干扰,也不会误碰主进程。

常见问题(FAQ)

Q:attach 上去卡住没反应?
A:主进程不输出或不读 stdin(启动时没带 -it)。Ctrl+P Ctrl+Q 脱离,改用 logs 或 exec。

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

Q:K8s 里等价命令?
A:kubectl attach pod名 -c 容器名,同样支持 detach 键序列;排查看日志用 kubectl logs -f

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台