跳转至

Docker 运维与排障

观察容器

docker ps -a
docker logs --tail 200 web
docker inspect --format '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}}' web
docker stats --no-stream
docker events --since 1h

常见问题

现象 优先检查
容器不断重启 docker logs、退出码、健康检查、依赖服务。
端口无法访问 端口映射、宿主机防火墙、服务监听地址。
数据消失 是否挂载正确的 volume/bind mount,是否误执行 down --volumes
内存退出 OOMKilled、容器内存限制、应用堆参数和宿主机内存。
磁盘增长 docker system df、容器日志、无用镜像和构建缓存。

安全清理

docker system df
docker image prune
docker container prune

docker system prune -a --volumes 影响范围很大,可能删除未使用镜像和数据卷;先确认目标后再清理。

固定排障流程

宿主机是否健康
  → Docker daemon 是否健康
  → 容器是否创建/运行
  → 主进程为何退出或不健康
  → 网络、挂载、配置是否正确
  → 应用依赖是否可用

先记录容器名、镜像 ID/Digest、创建时间、退出码、OOM 状态、重启次数和最近事件,再重建或清理。

date -Is
uptime
df -hT
df -ih
free -h
systemctl status docker containerd
journalctl -u docker --since '-30 min'
docker info
docker ps -a --no-trunc

容器无法启动或持续重启

docker inspect --format \
  'status={{.State.Status}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}} error={{.State.Error}} restarts={{.RestartCount}}' app
docker logs --timestamps --tail 300 app
docker inspect app
Exit Code/现象 常见方向
0 主进程正常结束,可能把一次性命令当服务运行
1/其他应用码 启动参数、配置、依赖和应用错误日志
126 文件存在但不可执行、权限/挂载 noexec
127 命令或解释器不存在,ENTRYPOINT/CMD 错误
137 SIGKILL,常见 OOM 或人工/系统强杀
143 收到 SIGTERM 后退出,确认谁停止以及退出是否优雅

持续重启会让 docker exec 很难使用,可以先取消自动重启并按同镜像启动一次性调试容器,但不要覆盖原数据卷:

docker update --restart=no app
docker run --rm -it --entrypoint sh app-image:version

端口和网络不通

docker port app
docker inspect --format '{{json .NetworkSettings.Networks}}' app
ss -lntp
docker network inspect <network>

按“应用监听 → 容器 IP → 服务名 → 主机 published port → 防火墙/安全组 → 外部 LB”逐层测试。容器内 localhost 不是宿主机,也不是另一个容器。

CPU 高

docker stats --no-stream
docker top app -eo pid,ppid,user,%cpu,%mem,etime,args
docker inspect --format '{{.HostConfig.NanoCpus}} {{.HostConfig.CpuQuota}}' app

区分业务流量、死循环、频繁重试、GC、加解密/压缩和 CPU throttling。容器统计需要与应用指标、线程栈/perf/JFR 和宿主机负载对应,不能只凭瞬时百分比重启。

内存高与 OOM

docker stats --no-stream
docker inspect --format '{{.HostConfig.Memory}} {{.State.OOMKilled}}' app
journalctl -k --since '-1 hour' | grep -i oom

容器 OOM、宿主机 OOM 和应用自己抛出 OutOfMemoryError 不是同一件事。核对 limit、工作集、缓存、连接/线程、JVM Heap/Direct Memory、Node.js/Python 进程以及宿主机余量。提高 limit 前先确认是否泄漏或容量基线错误。

磁盘增长

docker system df -v
docker inspect --format '{{.LogPath}}' app
du -xh /var/lib/docker --max-depth=1 2>/dev/null | sort -h

先区分日志、Volume 业务数据、容器可写层、镜像或 Build Cache。正在运行容器的可写层异常增长可用 docker diff 查变化。清理只能针对已确认可重建、无引用的对象。

升级与维护

  1. 记录 docker version/info、存储和日志驱动、daemon 配置。
  2. 验证目标版本对 OS、内核、cgroup、Compose 和镜像格式的支持。
  3. 备份 Compose/配置、Volume/数据库与恢复步骤。
  4. 在非生产验证停止、启动、网络、挂载和日志。
  5. 生产逐台维护;确认业务有其他实例或安排中断窗口。
  6. 升级后验证 daemon、所有容器、端口、网络、数据、日志与业务。

单机 Docker 没有集群级故障转移。宿主机故障恢复依赖备机、配置重建、镜像仓库、数据备份和明确的恢复操作手册。

证据清单

docker version
docker info
docker ps -a --no-trunc
docker inspect app
docker logs --timestamps --since 30m app
docker events --since 30m
systemctl status docker containerd
journalctl -u docker --since '-30 min'

分享前清理 Registry 凭据、环境变量 Secret、内网地址和业务数据。不要直接把完整 docker inspect 发到公开工单。

官方参考:Docker Engine troubleshooting