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

相关推荐
bosins22 分钟前
彻底解决 WSL 2.7+ 空闲自动关闭/内存回收导致 Docker 中断的问题
linux·docker·wsl·dashboard
我要见SA姐12 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
orangapple3 小时前
在docker里启动 orthancteam/orthanc
docker
Elastic 中国社区官方博客3 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
fengkai45454 小时前
八、Docker详解4-5
运维·docker
智恒百亿5 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
蓝胖的四次元口袋7 小时前
Docker Compose多容器编排与Nginx集群实战
运维·nginx·docker compose
懂软件的胡子个哥7 小时前
微信 API 消息回调怎么设计,才能避免丢消息和重复处理
运维·微信·架构·wechatapi·个人微信号二次开发
吉甫作诵7 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Acrellea9 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源