第二十篇:《Docker 故障排查常用命令与技巧》

容器化环境故障排查常常比传统环境更复杂:动态的容器 ID、短暂的文件系统、隔离的网络命名空间。本文汇总了 Docker 日常运维中最实用的故障排查命令和技巧,涵盖容器无法启动、网络不通、磁盘满、资源泄漏等常见问题。熟练使用这些命令,你将能快速定位并解决生产环境中的容器问题。

一、信息收集命令

1.1 查看系统总体状态

bash 复制代码
docker info           # Docker 系统信息(容器数、镜像数、存储驱动、内核版本)
docker version        # 客户端和服务端版本
docker system df      # 磁盘使用情况(镜像、容器、卷、构建缓存)

1.2 容器状态详情

bash 复制代码
docker ps -a                     # 所有容器(包括停止的)
docker ps -a -q                  # 只显示容器 ID
docker inspect <container>       # 完整 JSON 详情(IP、挂载、环境变量、网络)
docker inspect --format '{{.State.Status}}' <container>  # 只提取状态

二、日志查看与分析

2.1 查看日志

bash 复制代码
docker logs <container>          # 标准输出日志
docker logs --tail 100 <container>
docker logs -f <container>       # 实时跟踪
docker logs -t <container>       # 带时间戳

2.2 定位日志驱动问题

如果 docker logs 无输出,检查日志驱动:

bash 复制代码
docker inspect --format '{{.HostConfig.LogConfig.Type}}' <container>

若为 json-file 但仍无输出,检查应用是否输出到 stdout/stderr。

2.3 容器内日志文件

对于将日志写入内部文件的容器(不推荐),可进入容器查看:

bash 复制代码
docker exec -it <container> tail -f /var/log/app.log

三、进入容器调试

3.1 使用 exec

bash 复制代码
docker exec -it <container> bash   # 若支持 bash
docker exec -it <container> sh     # 若只有 sh

3.2 以 root 进入

bash 复制代码
docker exec -u root -it <container> bash

3.3 在容器内执行单条命令

bash 复制代码
docker exec <container> ps aux
docker exec <container> cat /etc/os-release
docker exec <container> netstat -tlnp

四、网络问题排查

4.1 查看容器 IP

bash 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>

4.2 测试容器间连通性

bash 复制代码
docker exec <containerA> ping <containerB_name_or_IP>

注意:默认 bridge 网络不支持名称解析,需使用自定义网络。

4.3 端口映射检查

bash 复制代码
docker port <container>           # 显示映射关系
netstat -tlnp | grep <port>       # 宿主机上确认端口监听

4.4 进入容器网络命名空间(高级)

bash 复制代码
# 获取容器 PID
PID=$(docker inspect -f '{{.State.Pid}}' <container>)
# 使用 nsenter 进入网络命名空间
nsenter -t $PID -n ip addr
nsenter -t $PID -n tcpdump -i eth0

需要宿主机安装 nsenter(util-linux 包)。

五、资源占用问题

5.1 查看实时资源

bash 复制代码
docker stats                  # 所有容器实时流
docker stats --no-stream      # 一次快照
docker stats <container>      # 单个容器

5.2 查看容器内进程

bash 复制代码
docker top <container>         # 类似 Linux top
docker exec <container> ps aux

5.3 查看容器根目录大小

bash 复制代码
docker ps -s                   # 显示每个容器的大小(可写层)

5.4 找出大文件在容器内

bash 复制代码
docker exec <container> du -sh /* | sort -h

六、存储与卷问题

6.1 查看卷挂载

bash 复制代码
docker inspect <container> | jq '.[].Mounts'   # 需要 jq
# 或
docker inspect -f '{{json .Mounts}}' <container> | python -m json.tool

6.2 查看卷占用空间

bash 复制代码
docker system df -v           # 详细列出每个卷的大小
docker volume ls -q | xargs docker volume inspect | grep Mountpoint

6.3 清理未使用的卷

bash 复制代码
docker volume prune -f

七、镜像问题

7.1 查看镜像历史层

bash 复制代码
docker history <image> --no-trunc

7.2 分析镜像大小

bash 复制代码
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 使用 dive 工具(第三方)
dive <image>

7.3 删除悬空镜像

bash 复制代码
docker image prune -f
docker image prune -a -f      # 删除所有未使用镜像(危险)

八、容器退出码分析

容器退出码常见含义:

查看退出码:docker inspect -f '{{.State.ExitCode}}'

九、常见故障场景及解决

场景1:容器启动后立即退出

bash 复制代码
docker logs <container>               # 查看日志
docker run -it <image> sh             # 交互式运行调试
# 如果 CMD 有问题,可覆盖:docker run -it <image> /bin/sh

场景2:端口冲突

bash 复制代码
netstat -tlnp | grep <port>
# 或
ss -tlnp | grep <port>
# 修改映射端口或停止占用进程

场景3:磁盘空间满

bash 复制代码
docker system df
docker system prune -a -f --volumes   # 谨慎使用,会删除所有未使用数据
# 或手动清理:
docker container prune
docker image prune -a
docker volume prune
docker builder prune

场景4:容器内无法访问外网

bash 复制代码
# 检查宿主机 IP 转发
sysctl net.ipv4.ip_forward
# 若为0,临时开启
sysctl -w net.ipv4.ip_forward=1
# 永久开启:编辑 /etc/sysctl.conf

场景5:时间不同步

bash 复制代码
# 挂载宿主机时区文件
docker run -v /etc/localtime:/etc/localtime:ro ...
# 或在 compose 中配置

十、终极技巧:调试容器运行时

有时容器已死,无法 docker exec,可使用 docker run --rm -it --pid=container:<container_id> --net=container:<container_id> alpine sh 共享 PID 和网络命名空间,但需注意该容器必须还在运行(非 Exited)。

十一、常用诊断别名

在 ~/.bashrc 中添加:

bash 复制代码
alias dk='docker'
alias dkps='docker ps -a'
alias dklog='docker logs -f'
alias dkin='docker exec -it'
alias dkinsp='docker inspect'
alias dkrmall='docker rm -f $(docker ps -aq)'
alias dkrmi='docker rmi -f $(docker images -q)'

十二、小结

故障排查是 Docker 生产运维的核心能力。本文介绍的命令和技巧覆盖了绝大多数常见问题场景。建议在实际工作中勤用 docker inspect、docker logs、docker exec 三板斧,并配合 docker stats 观察资源。对于复杂问题,可以结合 nsenter 深入容器网络命名空间。最后,定期清理无用资源是保持系统健康的良好习惯。

相关推荐
jcbut1 小时前
离线安装dify 1.7
linux·运维·dify
Qiuner1 小时前
Pico 重塑Agent时代人与数据交互方式
windows·docker·ai·架构
云计算磊哥@2 小时前
运维开发宝典024-Linux云计算运维入门阶段总结
linux·运维·运维开发
周小码2 小时前
10分钟搭建私有Git服务器:Soft Serve实战
运维·服务器·git
木雷坞2 小时前
6月 Docker 国内镜像源配置:daemon.json、/v2/ 连通性和 pull 验证
docker·eureka·json
The Open Group2 小时前
从项目到产品:数字化转型为何进入“产品时代”?
运维
Urbano3 小时前
休闲束脚裤全生产工艺科普:从裁片到成衣,缝纫工序与自动化设备选型详解
运维·自动化
萤丰信息3 小时前
AI 重构园区运维|全场景无人化智慧运维:破解传统物业高成本痛点
运维·人工智能·重构
AI创界者4 小时前
运维进阶:如何使用 Medusa 进行企业内部服务器密码合规性审计?
运维·服务器