docker attach 是什么
attach 把当前终端直接接到容器的标准输入输出上,相当于你坐在容器主进程(PID 1)的终端前面:它的日志直接刷在你屏幕上,你敲的键送进它的标准输入,你按的 Ctrl-C 会变成信号发给它。这与 docker exec 有本质区别——exec 是在容器里另开一个进程,attach 是与主进程共用同一个终端。也正因为连着主进程,attach 的操作带有停服务风险。
基本信息
| 语法 | docker attach [--detach-keys=按键] [--no-stdin] [--sig-proxy=true|false] 容器 |
|---|---|
| 脱离方式 | 默认组合键 Ctrl-P Ctrl-Q,脱离而不停止容器 |
| 前置条件 | 容器以交互或前台方式运行且已启用标准输入 |
| 日志驱动限制 | 使用 syslog、journald 等非本地驱动时无法 attach |
| 信号行为 | 默认 sig-proxy=true,终端信号会转发给容器主进程 |
| Linux 常用 | docker attach $(docker ps -q -f name=web) |
典型使用场景
- 观察一个前台运行进程的实时输出,比反复 logs 更连续
- 需要与主进程交互的场景:交互式容器、需要键盘输入的命令行程序
- 临时接手一个启动脚本的确认提示,例如等待用户按回车继续
- 配合 --no-stdin 纯看输出,避免误触键盘影响运行中的服务
- 排查终端相关问题时验证容器的标准流是否正常
附着、脱离与调整
附着、脱离与调整
# 附着到容器主进程;Ctrl-P Ctrl-Q 脱离,容器继续运行
docker attach web
# 只看输出不接管标准输入,防止误敲命令影响服务
docker attach --no-stdin web
# 换一个不容易误触的脱离组合键
docker attach --detach-keys='ctrl-d' web
# 想只看日志又怕误操作,优先用 logs 而不是 attach
docker logs -f --tail 50 web
# 真要排查问题用 exec 另开进程,不影响主进程
docker exec -it web sh两种接入方式对比
| 维度 | docker attach | docker exec |
|---|---|---|
| 连接的进程 | 容器主进程 PID 1 | 容器内新开的进程 |
| 对服务影响 | 键盘信号直接影响主进程 | 不影响主进程 |
| Ctrl-C 后果 | 默认会让主进程收到中断 | 只影响新开的进程 |
| 脱离方式 | Ctrl-P Ctrl-Q 组合键 | 直接退出即可 |
| 适用场景 | 看输出、与主进程交互 | 进容器排查与运维 |
attach 之后终端里敲的字符会进入容器进程的标准输入,生产排障建议先加 --no-stdin,确认安全后再决定是否接管输入。
许多服务的日志走非本地日志驱动或输出到文件,attach 里可能什么都看不到;这时应查日志驱动配置或容器内日志文件,而不是反复重试 attach。