如何用新终端(TTY)进入已经在运行的 Docker 容器?
docker exec -it 容器名 sh(或 bash)为运行中的容器开一个新终端会话;退出用 exit,不影响主进程。本文说明参数含义与无 shell 镜像的替代方案。
一条命令:docker exec -it <容器名或ID> sh——在运行中的容器里新起一个带 TTY 的交互 shell。有 bash 的镜像(Ubuntu/Debian 系)可用 bash 体验更好;退出输 exit,只结束这个 shell,容器主进程不受影响。
参数拆解
docker exec -it myapp bash
-i:保持 stdin 打开(能输入)-t:分配伪终端(有提示符、能补全)- 两个合起来才是完整的交互终端
成功后提示符类似 root@f3a2b1c9:/#,此时就在容器里了。
常用变体
# 以 root 身份进入(容器默认用户无权限时)
docker exec -u 0 -it myapp sh
# 以指定用户进入
docker exec -u www-data -it myapp sh
# 只跑一条命令不开终端
docker exec myapp cat /etc/app/config.yml
没有 bash/sh 怎么办
极简镜像(alpine 有 sh;distroless、scratch 连 sh 都没有)进不去时的替代:
docker cp myapp:/app/logs ./logs # 拷文件出来看
docker diff myapp # 看文件系统改动
docker logs myapp # 看输出
K8s 场景可用 kubectl debug 给 Pod 挂一个带工具的临时容器。
exec vs attach 再强调
exec 是新进程,怎么折腾都不伤主进程;attach 是接主进程,Ctrl+C 会误停容器。进容器排查永远用 exec。
观测云对照
少进容器是观测成熟的标志。 日志、指标、调用链都被观测云采集后,80% 的"exec 进去看看"需求消失;剩下的现场排查,前后行为差异也能在监控曲线里对照验证。
常见问题(FAQ)
Q:报 "container is not running"?
A:容器已停止(docker ps -a 确认),exec 只能进运行中的容器;docker start 后再进。
Q:进去之后很多命令找不到?
A:精简镜像只装运行必需的东西;apt/apk 现装,或改用拷文件出来的方式。
Q:能同时开多个 exec 会话吗?
A:可以,互不干扰——这也是 exec 优于 attach 的一点。