要进入当前正在运行的 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
导致意外停止容器!