Docker 排障:构建、退出、网络与存储 · Docker 故障排查
Docker 排障:构建、退出、网络与存储
Docker 故障排查
1. 原则与现场
先确认 host、Context、项目、容器和时间范围;先采集再重启/清理,一次只改一个变量。
date -Is
docker context show
docker version
docker ps -a --no-trunc
docker system df -v
sudo journalctl -u docker --since '30 min ago' --no-pager容器现场:
docker inspect CONTAINER
docker logs --since 30m --timestamps CONTAINER
docker stats --no-stream CONTAINER输出可能含环境变量、地址和挂载,对外发送前脱敏。
2. Daemon 无法连接
docker context ls
printf '%s\n' "${DOCKER_HOST:-unset}"
ls -l /var/run/docker.sock
sudo systemctl status docker --no-pager
sudo journalctl -u docker -n 200 --no-pager
sudo dockerd --validate --config-file=/etc/docker/daemon.json检查 Context、daemon 状态、socket 权限、配置、磁盘和证书。不要用 chmod 666 socket 绕过权限问题。
3. 容器退出或重启
docker logs --tail 200 api
docker inspect api \
--format 'status={{.State.Status}} exit={{.State.ExitCode}} error={{.State.Error}} oom={{.State.OOMKilled}}'
docker inspect api \
--format 'entrypoint={{json .Config.Entrypoint}} cmd={{json .Config.Cmd}}'退出码 125/126/127 常指 Docker 启动失败、命令不可执行、命令不存在;137 需结合 OOM/信号判断。重启循环时先采集,再临时:
docker update --restart=no api
docker stop api修复后把正确策略同步回部署清单。
4. 镜像、网络与 DNS
docker buildx imagetools inspect IMAGE
docker inspect api --format '{{json .NetworkSettings.Networks}}'
docker network inspect app-net
docker exec api getent hosts db
docker exec api cat /etc/resolv.conf
docker exec api ss -lntup
docker port api
curl -v http://127.0.0.1:8080/healthz拉取报错时:unauthorized 查身份/scope,manifest unknown 查引用,no matching manifest 查平台,x509 查 CA、链、hostname 和时间。连通性检查同一网络、服务名、端口、监听地址及 VPN 网段冲突。
5. 权限与存储
docker exec api id
docker inspect api --format '{{json .Mounts}}'
docker exec api stat -c '%u:%g %a %n' /app/data
sudo stat -c '%u:%g %a %n' /srv/app/data
df -hT
df -i
sudo du -xhd1 /var/lib/docker | sort -h修复准确 UID/GID、mode 或 LSM policy;不要 chmod -R 777、关闭 SELinux/AppArmor或直接删除 Docker data-root 内部文件。
6. OOM 与性能
docker inspect api \
--format 'oom={{.State.OOMKilled}} memory={{.HostConfig.Memory}}'
docker stats --no-stream api
sudo journalctl -k --since '1 hour ago' | grep -i oom区分泄漏、峰值、限制过低和宿主整体资源不足,提高 limit 前先压测。
7. Compose 与 Build
docker compose config
docker compose ps -a
docker compose logs --since 30m --timestamps
docker buildx inspect --bootstrap
docker buildx build --progress=plain --no-cache .Compose 核对 -f 顺序、项目名、变量和 profile;Build 本地无镜像时检查 driver 与 --load,exec format error 检查平台。
8. 高风险救援
rm -f、任意 prune、compose down --volumes、删除 data-root、切换存储驱动、重装或大版本升级都不是普通诊断步骤,必须审批、备份并确认影响范围。
9. 官方参考
补充实践:Docker 镜像构建失败
来源:show-cmd;原记录日期:未标注。以下保留来源案例的环境和版本范围。
定位失败层,检查构建上下文、文件复制和依赖安装。
在包含 Dockerfile 的目录执行构建。构建上下文由最后的路径参数决定;COPY 看不到上下文之外的文件,也可能被 .dockerignore 排除。
排查步骤
1. 显示完整构建输出
docker build --progress=plain -t local-debug .预期结果: 记录失败的 Dockerfile 指令及其原始错误,而不是只看最后一行。
2. 核对上下文与排除规则
ls -la
cat .dockerignore预期结果: COPY 的源文件位于构建上下文内,且未被 .dockerignore 排除。
3. 仅在怀疑缓存时重新构建
docker build --no-cache --progress=plain -t local-debug .预期结果: 若失败消失,检查缓存层依赖;若仍失败,回到失败层检查命令和网络。
常见报错
COPY failed / file not found
原因: 源文件不在上下文中或被忽略。
处理方式: 核对最后的构建路径、COPY 相对路径和 .dockerignore。
RUN 命令返回非零退出码
原因: 该层内的依赖安装或编译命令失败。
处理方式: 查看完整输出中的首个具体错误,核对镜像内工作目录、包管理器和网络。
相关文档
官方资料
补充实践:Docker 容器启动后退出
来源:show-cmd;原记录日期:未标注。以下保留来源案例的环境和版本范围。
用退出码、日志和容器状态区分应用崩溃与配置问题。
容器的主进程结束后容器会停止。先保留失败容器和日志,确认启动命令、环境变量、挂载和资源限制,再决定是否重建。
排查步骤
1. 确认容器与退出状态
docker ps -a --filter name=<container>预期结果: STATUS 显示退出时间与状态,避免只查看运行中的容器。
2. 读取退出前日志
docker logs --tail=100 <container>预期结果: 应用日志给出异常、缺少配置或连接失败的具体位置。
3. 核对退出码与 OOM 状态
docker inspect --format '{{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' <container>预期结果: OOMKilled 为 true 时优先排查内存;否则结合退出码和日志检查主进程。
常见报错
ExitCode 1
原因: 主进程报告错误并退出。
处理方式: 以 logs 中第一条实际应用错误为起点,核对入口命令和配置。
OOMKilled true
原因: 容器超出可用内存。
处理方式: 检查负载、内存使用和限制,修复内存问题或按容量需求调整限制。
相关文档
官方资料
继续阅读
- 知识专题
- 命令
- 命令