Docker线上问题排查常用的19个命令

在容器化应用的生产环境中,当问题出现时,快速准确的诊断和解决能力直接关系到业务的可用性和用户体验。

本文总结了19个Docker线上问题排查的常用命令和工具,掌握这些命令和工具都能显著提升你的问题排查效率。

基础排查命令

1. docker ps - 容器状态检查

列出所有运行中或已停止的容器,这是排查问题的第一步。

实际应用

# 查看所有运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 显示最近创建的容器
docker ps -n 5

# 只显示容器ID
docker ps -q

# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

使用技巧
设置别名加速日常操作:

# 在~/.bashrc或~/.zshrc中添加
alias dps='docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'

2. docker logs - 日志分析利器

查看容器日志输出,是排查应用程序内部问题的基本工具。

实际应用

# 查看容器日志
docker logs container_id_or_name

# 实时查看最新日志
docker logs -f container_id_or_name

# 查看最近100行日志
docker logs --tail 100 container_id_or_name

# 显示时间戳
docker logs -t container_id_or_name

# 查看特定时间段的日志
docker logs --since 2023-10-25T10:00:00 --until 2023-10-25T11:00:00 container_id_or_name

使用技巧
结合grep提取关键信息:

# 提取错误信息并显示上下文
docker logs container_id_or_name 2>&1 | grep -A 3 -B 3 "ERROR"

# 查找特定异常
docker logs container_id_or_name | grep "OutOfMemoryError"

3. docker inspect - 容器详情探测器

查看容器、镜像或网络的底层详细信息,是深入了解容器配置的关键工具。

实际应用

# 查看容器的详细配置
docker inspect container_id_or_name

# 提取特定信息(IP地址)
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name

# 查看容器的环境变量
docker inspect --format='{{.Config.Env}}' container_id_or_name

# 查看容器的挂载点
docker inspect --format='{{range .Mounts}}{{.Source}} -> {{.Destination}}{{end}}' container_id_or_name

# 检查容器的重启策略
docker inspect --format='{{.HostConfig.RestartPolicy}}' container_id_or_name

使用技巧
使用jq进行高级过滤:

# 安装jq: sudo apt install jq 或 brew install jq
docker inspect container_id_or_name | jq '.[0].State.Health'

4. docker stats - 资源监控实时仪表盘

提供容器资源使用的实时视图,包括CPU、内存、网络和磁盘I/O。

实际应用

# 查看所有容器的资源使用情况
docker stats

# 查看特定容器的资源使用
docker stats container_id_or_name

# 自定义格式输出
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

# 一次性输出当前状态(不持续刷新)
docker stats --no-stream

使用技巧
结合watch命令定期监控:

# 每5秒更新一次所有容器的资源状态
watch -n 5 'docker stats --no-stream'

5. docker exec - 容器内部操作工具

在运行中的容器内执行命令,是深入容器内部排查问题的必备工具。

实际应用

# 在容器内执行命令
docker exec container_id_or_name ls -la /app

# 进入容器的交互式shell
docker exec -it container_id_or_name /bin/bash

# 以特定用户身份执行命令
docker exec -u root container_id_or_name cat /etc/passwd

# 在特定工作目录执行命令
docker exec -w /app container_id_or_name pwd

使用技巧
对于精简镜像,可能需要先安装调试工具:

# 在Alpine基础镜像中安装常用工具
docker exec -it container_id_or_name /bin/sh
apk add --no-cache curl procps net-tools busybox-extras

高级排查命令

6. docker top - 容器进程查看器

显示容器内运行的进程,类似于主机上的top命令。

实际应用

# 查看容器内的进程
docker top container_id_or_name

# 自定义格式(使用ps的格式选项)
docker top container_id_or_name aux

使用技巧
结合watch命令监控进程变化:

# 每2秒刷新一次进程列表
watch -n 2 "docker top container_id_or_name"

7. docker diff - 文件系统变更检测器

显示容器文件系统相对于初始镜像的变化,对查找配置修改或异常文件非常有用。

实际应用

# 查看容器文件系统的变更
docker diff container_id_or_name

输出格式说明:

  • A: 文件或目录被添加
  • D: 文件或目录被删除
  • C: 文件或目录被修改

使用技巧
结合grep过滤特定目录的变更:

# 只查看/etc目录下的变更
docker diff container_id_or_name | grep "^. /etc"

8. docker events - 事件历史记录器

实时显示Docker守护进程中发生的事件,如容器的创建、启动、停止等。

实际应用

# 实时查看Docker事件
docker events

# 查看过去的事件
docker events --since '2023-10-25'

# 过滤特定类型的事件
docker events --filter 'type=container' --filter 'event=stop'

# 格式化输出
docker events --format '{{.Time}} {{.Type}} {{.Action}}'

使用技巧
在另一个终端执行操作,同时观察events输出,可以了解Docker内部发生了什么:

# 终端1
docker events

# 终端2
docker start my-container
docker stop my-container

9. docker network inspect - 网络配置分析工具

检查Docker网络配置,对排查容器间通信问题至关重要。

实际应用

# 列出所有网络
docker network ls

# 检查特定网络
docker network inspect network_name

# 查看网络中所有容器
docker network inspect network_name --format='{{range .Containers}}{{.Name}} {{.IPv4Address}}{{end}}'

# 连接容器到网络
docker network connect network_name container_id_or_name

# 断开容器与网络的连接
docker network disconnect network_name container_id_or_name

使用技巧
使用专用的网络调试容器:

# 启动一个网络工具容器并连接到目标网络
docker run --rm -it --network=target_network nicolaka/netshoot

# 在容器中使用各种网络工具
ping container_name
dig container_name
tcpdump -i eth0

10. docker-compose logs - 多容器日志聚合器

同时查看docker-compose管理的多个相关容器的日志,对微服务架构排障特别有用。

实际应用

# 查看所有服务的日志
docker-compose logs

# 查看特定服务的日志
docker-compose logs service_name

# 持续查看日志
docker-compose logs -f

# 查看最近的日志
docker-compose logs --tail=100

# 显示时间戳
docker-compose logs -t

使用技巧
在复杂系统中跟踪请求:

# 使用请求ID或会话ID跟踪请求流程
docker-compose logs | grep "request-xyz-123"

11. docker history - 镜像构建分析工具

显示镜像的构建历史,帮助了解镜像的构成和潜在问题。

实际应用

# 查看镜像的构建历史
docker history image_name:tag

# 显示完整的命令(不截断)
docker history --no-trunc image_name:tag

# 格式化输出
docker history --format "{{.CreatedBy}}: {{.Size}}" image_name:tag

使用技巧
分析镜像大小问题:

# 查找最大的层
docker history image_name:tag --format "{{.Size}}: {{.CreatedBy}}" | sort -hr | head -5

12. docker system df - 磁盘使用分析器

显示Docker使用的磁盘空间情况,包括镜像、容器和卷的空间占用。

实际应用

# 查看Docker磁盘使用概况
docker system df

# 显示详细信息,包括未使用的对象
docker system df -v

使用技巧
定期监控磁盘使用情况:

# 创建定时任务监控Docker磁盘使用
echo "0 9 * * * docker system df -v | mail -s 'Docker Disk Usage Report' admin@example.com" | crontab

13. docker system prune - 资源清理工具

清理未使用的Docker资源,包括停止的容器、未使用的网络、悬空镜像和构建缓存。

实际应用

# 基本清理
docker system prune

# 清理包括未使用的镜像
docker system prune -a

# 清理包括未使用的数据卷
docker system prune -a --volumes

# 强制清理(不提示)
docker system prune -f

使用技巧
在CI/CD流水线中自动清理:

# Jenkins流水线中的清理步骤
stage('Cleanup') {
    steps {
        sh 'docker system prune -f'
    }
}

第三方排查工具

14. ctop - 容器性能监控可视化工具

提供类似top命令的交互式界面,实时显示容器的CPU、内存、网络等资源使用情况。

安装方法

# Linux
sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop
sudo chmod +x /usr/local/bin/ctop

# Mac
brew install ctop

实际应用

# 启动ctop
ctop

# 按CPU使用率排序(在界面按下's'键,选择CPU)

使用技巧
ctop界面的快捷键:

  • f: 过滤容器
  • s: 更改排序
  • r: 反转排序
  • o: 切换显示选项
  • l: 查看容器日志
  • a: 显示/隐藏非活动容器

15. dive - 镜像层分析工具

交互式探索Docker镜像内容和分层结构,帮助优化镜像大小。

安装方法

# Linux
wget https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.deb
sudo apt install ./dive_0.10.0_linux_amd64.deb

# Mac
brew install dive

实际应用

# 分析镜像
dive image_name:tag

# 在CI中分析并强制执行效率规则
CI=true dive --ci-config .dive-ci.yaml image_name:tag

使用技巧
dive界面快捷键:

  • Tab: 在层视图和文件树之间切换
  • Ctrl+U: 移除未更改的文件显示
  • Ctrl+L: 压缩目录视图
  • Ctrl+S: 保存图层为tar归档文件

16. cadvisor - 容器监控与性能分析工具

提供容器资源使用情况的详细视图和历史数据,支持与Prometheus等监控系统集成。

安装方法

# 使用Docker运行cAdvisor
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor:v0.45.0

实际应用
访问 http://localhost:8080 查看Web界面,或使用API:

# 获取特定容器的统计信息
curl http://localhost:8080/api/v1.3/containers/docker/container_id

# 查询历史数据
curl http://localhost:8080/api/v1.3/containers/docker/container_id/stats?count=60

使用技巧
与Prometheus和Grafana集成,创建长期监控系统:

# prometheus.yml
scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['cadvisor:8080']

17. Portainer - Docker图形化管理工具

提供Docker环境的Web界面管理工具,简化容器、镜像、网络和卷的管理与监控。

安装方法

# 安装Portainer社区版
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:latest

实际应用
访问 https://localhost:9443 设置管理员账号并登录

使用技巧
创建多个环境,集中管理多个Docker主机:

  1. 设置→环境→添加环境
  2. 选择Docker API或Kubernetes API连接方式
  3. 提供远程Docker主机的连接信息

18. netshoot - 网络故障排查专用容器

包含几十种网络调试和排障工具的专用容器,用于深入分析容器网络问题。

使用方法

# 启动netshoot并连接到目标网络
docker run --rm -it --network=target_network nicolaka/netshoot

# 使用特定网络命名空间启动
docker run --rm -it --net container:target_container nicolaka/netshoot

实际应用

# 在netshoot容器中使用各种网络工具
ping service_name
dig service_name
curl -v service_name:port/health
tcpdump -i eth0 -n port 80
nslookup service_name
iptables -L

使用技巧
创建网络拓扑图:

# 使用netshoot中的工具生成网络拓扑
docker run --rm -it --net host nicolaka/netshoot
brew install -f && brew

19. lazydocker - 终端UI管理工具

提供终端界面的Docker管理工具,可以在无GUI环境中方便地管理和监控容器。

安装方法

# Linux/Mac
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash

# 使用Go安装
go install github.com/jesseduffield/lazydocker@latest

实际应用

# 启动lazydocker
lazydocker

使用技巧
lazydocker快捷键:

  • x: 显示菜单
  • a: 显示所有容器(包括停止的)
  • e: 进入容器的交互式shell
  • l: 查看容器日志
  • s: 停止容器
  • r: 重启容器
  • d: 删除容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值