Docker 容器启动失败怎么排查?

容器启动后立即退出或无法正常运行,不知道哪里出了问题

解决方案

查看容器日志定位错误 推荐

# 查看容器日志(即使容器已退出也能看)
docker logs my-container

# 查看最后 50 行日志
docker logs --tail 50 my-container

# 查看容器退出状态码
docker inspect --format '{{.State.ExitCode}}' my-container

大多数启动失败的原因都能从日志中找到。退出码 0 表示正常退出,1 表示应用错误,137 表示被 OOM Kill,139 表示段错误。

适用场景:容器启动后立即退出,需要确定失败原因

交互模式启动排查 推荐

# 用交互模式启动,覆盖默认命令
docker run -it --entrypoint sh myapp:latest

# 进入容器后手动执行启动命令
# 可以检查文件、环境变量、权限等
ls -la /app
env
cat /app/config.json

覆盖 entrypoint 进入容器 shell,手动执行命令逐步排查。可以检查文件是否存在、权限是否正确、配置是否正确。

适用场景:日志信息不够明确,需要进入容器内部排查

检查资源和配置问题

# 检查端口是否被占用
docker ps --format '{{.Ports}}'
netstat -tlnp | grep 8080

# 检查挂载的卷路径是否存在
ls -la /path/to/mount

# 检查环境变量是否正确
docker inspect --format '{{json .Config.Env}}' my-container | jq

常见原因包括:端口冲突、挂载路径不存在、环境变量缺失或错误、内存不足等。

适用场景:怀疑是环境配置问题导致启动失败

检查镜像和 Dockerfile 问题

# 查看镜像的 CMD 和 ENTRYPOINT
docker inspect --format '{{json .Config.Cmd}}' myapp:latest
docker inspect --format '{{json .Config.Entrypoint}}' myapp:latest

# 查看镜像构建历史
docker history myapp:latest

# 重新构建不使用缓存
docker build --no-cache -t myapp:latest .

检查 Dockerfile 中的 CMD/ENTRYPOINT 是否正确,构建过程是否有问题。

适用场景:新构建的镜像无法启动

注意事项

退出码 137 通常表示内存不足被 Kill,需要增加内存限制
检查 .dockerignore 是否误排除了必要文件
确保 CMD 中的可执行文件有执行权限

相关命令