最常用也最推荐的方式是用 docker exec 启动交互式 shell:先运行 docker ps 确认容器正在运行,若已停止则需先执行 docker start <容器名或ID>;再根据镜像类型选择 docker exec -it <容器名> /bin/bash(Ubuntu/Debian/CentOS)或 /bin/sh(Alpine)。
最常用也最推荐的方式是用 docker exec 启动一个交互式 shell,直接进入容器内部查看文件、环境变量、进程或网络状态。
确认容器正在运行并获取标识
先检查目标容器是否处于运行中:
- 运行
docker ps查看所有活跃容器,注意 NAME 或 CONTAINER ID 列 - 如果容器没在列表里,说明已停止,需先执行
docker start <容器名或ID> - 不确定名称时,可用
docker ps -f name=xxx过滤,或docker ps --format "table {{.Names}}\t{{.Status}}"精简显示
用 exec 进入交互式 Shell
根据镜像类型选择对应 shell:
- Ubuntu/Debian/CentOS 等常规镜像:用
docker exec -it <容器名> /bin/bash - Alpine、Distroless 或精简镜像:通常只有
/bin/sh,执行docker exec -it <容器名> /bin/sh - 若提示
executable file not found,说明容器里压根没装 shell,此时不能进 shell,但可尝试非交互方式查信息(见下条)
不进 shell,也能快速调试
很多调试任务其实不需要登录 shell,直接执行命令更安全高效:
- 查日志:
docker exec <容器名> cat /var/log/app.log - 看环境变量:
docker exec <容器名> env | grep -i port - 检查端口监听:
docker exec <容器名> netstat -tuln 2>/dev/null || ss -tuln - 验证网络连通性:
docker exec <容器名> ping -c 2 google.com(前提是容器内有 ping)
其他方法的适用边界
不是所有场景都适合 exec,有些替代方式要注意限制:
-
docker attach是附加到容器主进程(比如 nginx -g),不能新开 shell;多个终端 attach 会互相干扰,且按 Ctrl+C 可能终止容器,慎用 - SSH 进容器需额外装服务、开端口、配密钥,仅建议调试专用镜像或离线排障,生产环境一般禁用
-
nsenter属底层调试工具,适合 exec 失效又无法重启容器时,但需要宿主机权限和 PID,日常调试没必要


















