15.4.3 容器日志与状态查看

在容器运维中,日志与状态是定位问题与判断健康的核心入口。本节聚焦常用查看命令、日志驱动、容器状态字段、事件与诊断手段,帮助快速掌握“容器现在发生了什么”,并配套可执行示例、排错与练习。

1. 容器状态查看基础命令#

1.1 常用命令与字段#

  • docker ps:查看运行中容器
  • 常用参数:
    • -a 查看全部容器
    • --no-trunc 查看完整容器 ID
    • --format 自定义输出字段
  • docker inspect <容器>:查看容器详细状态与配置
  • 常见字段:
    • State.Status(created/running/exited/paused/restarting)
    • State.RunningState.ExitCodeState.Error
    • State.Health(健康检查结果)
  • docker stats:实时资源占用(CPU、内存、网络、IO)

1.2 可执行示例(含效果)#

# 1) 启动一个示例容器
docker run -d --name webdemo nginx:1.25

# 2) 查看运行容器
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'

# 3) 查看完整容器ID与状态字段
docker inspect webdemo --format \
'Status={{.State.Status}} ExitCode={{.State.ExitCode}} OOMKilled={{.State.OOMKilled}}'

# 4) 实时资源统计
docker stats --no-stream webdemo

预期效果:
- docker ps 显示容器 webdemo 处于 Up 状态
- docker inspect 输出 Status=running ExitCode=0 OOMKilled=false

2. 容器日志查看与常用参数#

2.1 基础日志命令与解释#

  • docker logs <容器>:查看标准输出/错误日志
  • -f 持续输出(follow)
  • --tail N 输出最后 N 行
  • --since/--until 按时间过滤
  • -t 显示时间戳
# 生成可重复的日志示例(每秒打印一行)
docker run -d --name logdemo busybox sh -c \
'while true; do echo "$(date +%F_%T) hello"; sleep 1; done'

# 查看最近 5 行并加时间戳
docker logs -t --tail 5 logdemo

# 从最近 10 秒开始跟踪
docker logs -f --since 10s logdemo

2.2 日志驱动与存储位置(原理草图)#

文章图片

2.3 日志驱动查询与配置示例#

# 查看当前日志驱动
docker info | grep -i 'Logging Driver'

Daemon 配置文件(/etc/docker/daemon.json)

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
# 应用配置并重启 Docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
EOF
sudo systemctl restart docker

# 验证
docker info | grep -i 'Logging Driver'

预期效果:日志轮转生效,单文件最大 10MB,最多保留 3 个文件。

3. 容器状态字段解读#

  • running:容器正常运行
  • exited:容器已退出
  • restarting:容器持续重启(需检查退出码与日志)
  • paused:容器被暂停(cgroup freezer)
  • created:已创建但未启动

关键字段说明:
- ExitCode
- 0 正常退出
- 非 0 表示异常
- OOMKilled:容器是否因内存不足被内核杀死
- RestartCount:重启次数(配合重启策略判断异常)

# 查看关键状态字段的快捷模板
docker inspect webdemo --format \
'Status={{.State.Status}} ExitCode={{.State.ExitCode}} RestartCount={{.RestartCount}} OOMKilled={{.State.OOMKilled}}'

4. 事件与进程状态查看#

4.1 容器事件#

  • docker events:实时查看容器生命周期事件
  • 用于判断何时启动、停止、重启或被 kill
  • 可加过滤条件 --filter container=<name>
# 过滤某个容器的事件
docker events --filter container=webdemo

4.2 进程与资源#

  • docker top <容器>:查看容器内进程
  • docker stats <容器>:实时资源消耗
  • docker exec <容器> ps aux:进入容器查看详细进程
# 查看容器进程
docker top webdemo

# 进入容器执行命令
docker exec -it webdemo ps aux | head

5. 常见问题与排查思路(含明确命令)#

  1. 容器不停重启
    - 查看日志:docker logs --tail 50 <容器>
    - 查看退出码:docker inspect <容器> --format '{{.State.ExitCode}}'
    - 查看事件:docker events --filter container=<容器>
  2. 容器无日志输出
    - 检查应用是否输出到 stdout/stderr
    - 检查日志驱动:docker info | grep -i 'Logging Driver'
  3. 日志时间不准确
    - 检查宿主机时区:timedatectl
    - docker logs -t 查看时间戳
  4. 日志过大导致磁盘不足
    - 配置日志轮转(见 2.3)
    - 配合集中式日志系统
  5. 健康检查失败
    - 查看 docker inspectState.Health
    - 确认 HEALTHCHECK 命令与依赖服务是否可达

6. 实战小练习(可执行)#

6.1 练习一:模拟异常退出并定位#

# 启动一个会立即退出的容器
docker run --name exitdemo busybox sh -c "exit 2"

# 查看状态与退出码
docker inspect exitdemo --format 'Status={{.State.Status}} ExitCode={{.State.ExitCode}}'

预期:Status=exited ExitCode=2

6.2 练习二:模拟日志增长并验证轮转#

# 生成大量日志(每 0.01 秒一行)
docker run -d --name spamlog busybox sh -c \
'while true; do echo "spam $(date +%s%N)"; sleep 0.01; done'

# 查看日志文件路径(json-file)
cid=$(docker inspect -f '{{.Id}}' spamlog)
ls -lh /var/lib/docker/containers/$cid/

# 等待轮转后查看文件数
sleep 10
ls -lh /var/lib/docker/containers/$cid/ | grep json.log

预期:日志文件大小受 max-size 限制,出现 -json.log.1 等轮转文件。


通过规范化日志与状态查看流程,可以快速判断容器故障类型并缩短恢复时间,为后续自动化监控与告警打下基础。