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

一、信息收集命令
1.1 查看系统总体状态

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

1.2 容器状态详情

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

二、日志查看与分析
2.1 查看日志

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

2.2 定位日志驱动问题
如果 docker logs 无输出,检查日志驱动:

docker inspect --format '{{.HostConfig.LogConfig.Type}}' <container>

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

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

docker exec -it <container> tail -f /var/log/app.log

三、进入容器调试
3.1 使用 exec

docker exec -it <container> bash   # 若支持 bash
docker exec -it <container> sh     # 若只有 sh

3.2 以 root 进入

docker exec -u root -it <container> bash

3.3 在容器内执行单条命令

docker exec <container> ps aux
docker exec <container> cat /etc/os-release
docker exec <container> netstat -tlnp

四、网络问题排查
4.1 查看容器 IP

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>

4.2 测试容器间连通性

docker exec <containerA> ping <containerB_name_or_IP>

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

4.3 端口映射检查

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

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

# 获取容器 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 查看实时资源

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

5.2 查看容器内进程

docker top <container>         # 类似 Linux top
docker exec <container> ps aux

5.3 查看容器根目录大小

docker ps -s                   # 显示每个容器的大小(可写层)

5.4 找出大文件在容器内

docker exec <container> du -sh /* | sort -h

六、存储与卷问题
6.1 查看卷挂载

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

6.2 查看卷占用空间

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

6.3 清理未使用的卷

docker volume prune -f

七、镜像问题
7.1 查看镜像历史层

docker history <image> --no-trunc

7.2 分析镜像大小

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

7.3 删除悬空镜像

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

八、容器退出码分析
容器退出码常见含义:

在这里插入图片描述

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

九、常见故障场景及解决
场景1:容器启动后立即退出

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

场景2:端口冲突

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

场景3:磁盘空间满

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

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

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

场景5:时间不同步

# 挂载宿主机时区文件
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 中添加:

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 深入容器网络命名空间。最后,定期清理无用资源是保持系统健康的良好习惯。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐