如何用新终端(TTY)进入已经在运行的 Docker 容器?

docker exec -it 容器名 sh(或 bash)为运行中的容器开一个新终端会话;退出用 exit,不影响主进程。本文说明参数含义与无 shell 镜像的替代方案。

最佳实践
如何用新终端(TTY)进入已经在运行的 Docker 容器?封面

一条命令: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 的一点。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台