Docker容器运维与故障排查实战手册

🐳 Docker容器运维与故障排查实战手册

1. 理解Docker日志系统

Docker的日志系统是排查容器问题的首要工具。默认情况下,Docker使用json-file日志驱动,将容器的标准输出(STDOUT)和标准错误(STDERR)保存为JSON格式的文件。

1.1 日志查看基础命令

docker logs命令是与容器日志交互的主要方式:

bash 复制代码
# 实时跟踪日志输出
docker logs -f <container-name>

# 显示最后10行日志
docker logs --tail 10 <container-name>

# 显示带时间戳的日志
docker logs -t <container-name>

# 从特定时间点开始查看日志
docker logs --since="2023-10-27T10:00:00" <container-name>

# 组合使用多个参数
docker logs --tail 20 -t -f <container-name>

1.2 日志文件存储位置

容器日志文件默认存储在/var/lib/docker/containers/<container-id>/<container-id>-json.log。你可以使用以下命令定位具体路径:

bash 复制代码
docker inspect --format='{{.LogPath}}' <container-name>

2. 常见Docker故障排查指南

2.1 容器启动故障

问题现象:容器无法启动或立即退出。

  • 检查容器状态 :使用docker ps -a查看所有容器状态,确认容器是否处于"Exited"状态
  • 查看详细日志 :使用docker logs <container-name>分析错误信息
  • 常见错误与解决方案
    • "exec user process caused: no such file or directory" :检查Dockerfile中WORKDIR设置和文件路径
    • "manifest for not found":验证镜像名称和标签是否正确
    • "executable file not found in $PATH":确认命令存在于容器的PATH环境变量中

2.2 磁盘空间不足问题

问题现象:磁盘占用率达100%,容器功能异常。

  • 检查磁盘空间 :使用df -h查看磁盘使用情况

  • 定位大文件目录 :使用du -h --max-depth=1 /var/lib/docker定位Docker相关大目录

  • 清理无用资源

    bash 复制代码
    # 清理停止的容器、无用网络和构建缓存
    docker system prune -a
    
    # 清理卷(谨慎操作)
    docker volume prune

2.3 网络连接问题

问题现象:容器间通信失败,端口访问不通。

  • 检查容器网络配置 :使用docker inspect <container-name> | grep -A 10 "NetworkSettings"

  • 验证端口映射 :使用docker port <container-name>查看端口映射情况

  • 解决端口冲突

    bash 复制代码
    # 检查端口占用
    netstat -tulnp | grep <port>
    
    # 更改容器映射端口
    docker run -p <new-port>:<container-port> ...

3. Docker守护进程问题排查

当Docker服务本身无法启动时,需要排查守护进程问题。

3.1 守护进程启动失败

错误信息"Job for docker.service failed because the control process exited with error code"

  • 查看服务状态sudo systemctl status docker.service
  • 检查详细日志sudo journalctl -u docker.service
  • 排查步骤
    1. 检查配置文件语法:/etc/docker/daemon.json
    2. 验证文件权限:确保/etc/docker/var/lib/docker目录权限正确
    3. 检查端口冲突:netstat -tuln | grep 2375

4. Docker日志轮转配置

防止日志文件无限增长导致磁盘空间耗尽。

4.1 配置全局日志轮转

编辑/etc/docker/daemon.json文件:

json 复制代码
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

应用配置:sudo systemctl daemon-reload && sudo systemctl restart docker

4.2 为单个容器设置日志轮转

bash 复制代码
docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

4.3 不同环境的日志配置建议

环境 max-size参数 max-file参数
开发环境 5m 3
测试环境 10m 5
生产环境 50m 10

5. 高级运维技巧

5.1 容器内直接调试

使用docker exec命令进入容器内部进行诊断:

bash 复制代码
# 进入容器shell
docker exec -it <container-name> /bin/bash

# 在容器内运行特定诊断命令
docker exec -it <container-name> ps aux
docker exec -it <container-name> cat /etc/config.conf

5.2 系统资源监控

  • 实时监控 :使用docker stats查看容器资源使用情况

  • 设置资源限制 :在运行时限制容器资源

    bash 复制代码
    docker run -d --name limited-container \
      --memory=512m \
      --cpus=1.5 \
      myapp:latest

6. 系统化故障排查流程

当遇到Docker问题时,遵循系统化的排查流程可以提高效率:
问题出现 检查容器状态
docker ps -a 查看日志
docker logs 识别问题类型 启动故障 运行异常 性能问题 资源不足 检查镜像
和配置 进入容器
调试 监控资源
使用情况 清理磁盘
和镜像 解决问题 记录解决方案

7. 日常维护最佳实践

  1. 定期检查日志文件大小,防止磁盘空间耗尽
  2. 配置监控告警,对容器异常状态进行实时监控
  3. 使用Docker Compose管理多容器应用,确保正确的启动顺序和依赖关系
  4. 定期更新Docker和镜像,修复已知安全漏洞
  5. 备份重要数据卷,防止数据丢失

通过本手册介绍的方法和流程,你可以建立起系统的Docker运维和故障排查能力。关键是要养成良好的日常维护习惯,在问题发生前预防,在问题发生时能快速定位和解决。

https://github.com/0voice

相关推荐
沉迷学习 日益消瘦8 小时前
10-Gateway API
运维·kubernetes·gateway
智购科技智能售货柜8 小时前
无人售货机连不上服务器?MQTT 频繁掉线排查全流程~YH
运维·服务器
心念枕惊8 小时前
Docker--Docker Swarm集群
运维·docker·容器
難釋懷8 小时前
Nginx-proxy缓存断点续传缓存 range
运维·nginx·缓存
井川廊咏9 小时前
【总集篇】Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户(补档)
linux·运维·服务器
敖行客 Allthinker9 小时前
docker容器安装Python反推镜像步骤(适用于临时调试用)
python·docker·容器
Kina_C9 小时前
LVS负载均衡的十二种核心调度算法
linux·运维·算法·负载均衡·lvs
AOwhisky9 小时前
Linux(CentOS)系统管理入门笔记(第十五期)——文件系统与存储管理(上篇):设备识别、挂载与文件查找
linux·运维·笔记·centos·文件系统
tonydf10 小时前
传统老手艺之容器编排
后端·容器·aiops
维核科技10 小时前
算力机房高负荷期稳供指南:GPU前置维保与应急处置方案
运维·服务器维修·gpu维修·算力卡维修