先查日志再查配置:执行docker logs 定位Error/Permission denied/端口冲突等报错,若日志为空则用docker inspect检查Cmd、Env、PortBindings和Volumes等配置字段,结合lsof、权限检查及退出码(如137=OOM)直击修复。
看到 docker start 或 docker run 报错,别急着重装,90% 的问题都能靠日志和配置快照快速定位。关键不是猜,而是按顺序查。
先看日志:容器已退出时的唯一线索
容器启动失败后处于 Exited 状态,docker logs 是第一入口:
- 执行
docker logs,重点找以Error、Fatal、Permission denied、port is already allocated开头的行 - 若提示
no such container,说明容器根本没创建成功,此时需回退到docker run命令本身或docker-compose up阶段排查 - 日志为空?常见于容器启动即崩溃(如主进程秒退),这时必须结合
docker inspect查启动命令和环境
再查配置:用 inspect 看清“它想干什么”
容器哪怕没跑起来,它的配置仍完整保留在 Docker 引擎中。运行:
docker inspect --format='{{json .Config}}' | jq
重点关注以下字段:
-
Cmd:实际执行的命令,确认是否写错路径、参数缺失或用了 shell 语法但镜像不带
/bin/sh -
Env:环境变量是否拼写错误(如
DB_HOST写成DB_HOTS),或敏感值为空 - ExposedPorts 和 HostConfig.PortBindings:端口映射是否冲突,比如宿主机 8080 已被 nginx 占用
-
Volumes:挂载路径是否存在?权限是否允许容器内用户读写?例如挂载
/data但宿主机该目录属 root:root 且无 world-writable 权限
常见报错对照与直击修复
不用背错误码,记住三类高频场景及其动作:
-
“port is already allocated”:立刻执行
lsof -i :8080(替换为你报错的端口),杀掉占用进程,或改-p 8081:80重新运行 -
“Permission denied” / “operation not permitted”:检查是否用了
--privileged或--cap-add;若挂载了目录,运行ls -ld /host/path确认权限,并在docker run中加:z或:Z(SELinux 环境) -
容器启动后立即退出(Exit Code 1/137/143):Code 137 = OOM 被杀 → 加
-m 512m限制内存;Code 143 = 被信号终止 → 检查Cmd是否前台运行(如nginx要加-g "daemon off;")
compose 场景下额外注意点
用 docker-compose up -d 启动失败,不能只看终端红字:
- 先运行
docker-compose config,验证 YAML 格式——缩进错一位、冒号后少空格都会直接报错 - 执行
docker-compose logs,比docker logs更精准,尤其多服务依赖时 - 若提示
pull access denied,确认镜像名拼写(如redis:alpine不是redis/alpine),并检查是否需docker login私有仓库











