容器化环境故障排查常常比传统环境更复杂:动态的容器 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 深入容器网络命名空间。最后,定期清理无用资源是保持系统健康的良好习惯。