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 prune -a --volumes 影响范围很大,可能删除未使用镜像和数据卷;先确认目标后再清理。
固定排障流程¶
先记录容器名、镜像 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 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 查变化。清理只能针对已确认可重建、无引用的对象。
升级与维护¶
- 记录
docker version/info、存储和日志驱动、daemon 配置。 - 验证目标版本对 OS、内核、cgroup、Compose 和镜像格式的支持。
- 备份 Compose/配置、Volume/数据库与恢复步骤。
- 在非生产验证停止、启动、网络、挂载和日志。
- 生产逐台维护;确认业务有其他实例或安排中断窗口。
- 升级后验证 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 发到公开工单。