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 中的可执行文件有执行权限