进入当前正在运行的 Docker 容器
要进入当前正在运行的 Docker 容器,可以使用 docker exec 命令。以下是详细方法:
1. 进入容器的交互式终端
docker exec -it <容器ID或名称> /bin/bash
参数说明:
-i(--interactive):保持标准输入(STDIN)打开,允许交互。-t(--tty):分配一个伪终端(TTY),使终端可交互。/bin/bash:指定要运行的 Shell(也可以是/bin/sh、/bin/zsh等)。
示例:
docker exec -it my_nginx /bin/bash
进入后,你会看到类似 root@a1b2c3d4e5f6:/# 的提示符,表示已成功进入容器。
2. 如果容器没有 Bash 或 Shell
某些精简镜像(如 alpine)可能没有 /bin/bash,可以改用 /bin/sh:
docker exec -it my_alpine_container /bin/sh
3. 以特定用户身份进入容器
如果容器内有其他用户(如 www-data),可以指定用户:
docker exec -it --user www-data my_nginx /bin/bash
4. 进入容器并执行一次性命令
如果不需要持续交互,可以直接运行命令并退出:
docker exec my_nginx ls /var/log # 查看容器内的日志目录
5. 使用 docker attach(谨慎使用)
docker attach <容器ID或名称>
注意:
- 这会直接连接到容器的主进程(PID 1),如果主进程是 Shell,可以交互。
- 风险:如果主进程不是 Shell(如 Nginx),直接退出(
Ctrl+C或exit)可能导致容器停止! - 推荐:仅在调试时使用,生产环境优先用
docker exec。
6. 常见问题
Q1: 报错 OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory
- 原因:容器内没有
/bin/bash。 - 解决:改用
/bin/sh:docker exec -it my_container /bin/sh
Q2: 如何退出容器而不停止它?
- 在交互式终端中,输入
exit或按Ctrl+D。 - 如果使用
docker attach,需先按Ctrl+P再按Ctrl+Q分离(否则会停止容器)。
Q3: 如何进入正在运行的容器的特定目录?
docker exec -it my_container bash -c "cd /path/to/dir && bash"
总结
| 场景 | 命令 | 备注 |
|---|---|---|
| 常规进入容器 | docker exec -it <容器> /bin/bash | 推荐方式 |
| 无 Bash 的容器 | docker exec -it <容器> /bin/sh | 适用于 Alpine 等精简镜像 |
| 以非 root 用户进入 | docker exec -it --user <用户> <容器> /bin/bash | 如 www-data、nginx 等 |
| 快速执行命令 | docker exec <容器> <命令> | 如 docker exec nginx ls |
优先使用 docker exec,避免使用 docker attach 导致意外停止容器!
