docker exec -it用于交互式进入运行中容器;/bin/bash适用于Ubuntu/CentOS等完整镜像,/bin/sh适用于Alpine等精简镜像,bash缺失时sh可兜底,兼容性最强。

用 docker exec -it,别用 docker attach —— 后者一退出就停容器,容易误杀服务。
确认容器确实在运行中
执行 docker ps,确保目标容器出现在列表里,且 STATUS 是 Up xxx。如果没看到,说明它根本没在运行:
• 容器已停止 → 先 docker start 容器名或ID
• 容器压根没启动过 → 检查镜像名、端口冲突或启动命令是否报错
docker exec -it 的实际写法和常见坑
核心命令是:docker exec -it 容器名或ID /bin/bash
但实际用时要注意:
- 大多数 Alpine 镜像不带
/bin/bash,得换/bin/sh:例如docker exec -it nginx-alpine /bin/sh - 容器里没装
bash或sh(极少数精简镜像)→ 用docker exec 容器名 ls /看根目录有哪些 shell 可选 - 权限不足?加
-u root强制切到 root:docker exec -u root -it 容器名 /bin/sh - 想进指定目录?加
-w参数:docker exec -it -w /app 容器名 /bin/sh
为什么不要用 docker attach
docker attach 容器名 看似简单,但有硬伤:
- 它直接接管容器的主进程 stdin/stdout/stderr —— 如果主进程是
nginx -g "daemon off;"这类前台进程,Ctrl+C或exit会发信号给它,导致整个容器退出 - 多个终端同时
attach同一个容器,所有输入输出会实时同步,一个卡住,全卡住 - 无法指定用户、工作目录、环境变量等,灵活性为零
进去了之后怎么安全退出
用 exec 进去后,直接敲 exit 或按 Ctrl+D 即可退出交互终端,容器继续运行。
注意:
• 不要反复执行 docker exec -it 开一堆 bash 子进程,虽然不影响容器,但会堆积僵尸进程(尤其在无 init 的镜像里)
• 如果容器内命令卡死,用 Ctrl+P Ctrl+Q 脱离(前提是没改过 detach-keys)
真正容易被忽略的是:有些镜像把 ENTRYPOINT 设成不可交互的二进制(比如某些 Java 应用 jar 包),这时 /bin/sh 可能起不来,得先 docker inspect 容器名 | grep -A5 Config 看它到底支持什么 shell,再试。


















