15.4.3 容器日志与状态查看
在容器运维中,日志与状态是定位问题与判断健康的核心入口。本节聚焦常用查看命令、日志驱动、容器状态字段、事件与诊断手段,帮助快速掌握“容器现在发生了什么”,并配套可执行示例、排错与练习。
1. 容器状态查看基础命令#
1.1 常用命令与字段#
docker ps:查看运行中容器- 常用参数:
-a查看全部容器--no-trunc查看完整容器 ID--format自定义输出字段
docker inspect <容器>:查看容器详细状态与配置- 常见字段:
State.Status(created/running/exited/paused/restarting)State.Running、State.ExitCode、State.ErrorState.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. 常见问题与排查思路(含明确命令)#
- 容器不停重启
- 查看日志:docker logs --tail 50 <容器>
- 查看退出码:docker inspect <容器> --format '{{.State.ExitCode}}'
- 查看事件:docker events --filter container=<容器> - 容器无日志输出
- 检查应用是否输出到 stdout/stderr
- 检查日志驱动:docker info | grep -i 'Logging Driver' - 日志时间不准确
- 检查宿主机时区:timedatectl
-docker logs -t查看时间戳 - 日志过大导致磁盘不足
- 配置日志轮转(见 2.3)
- 配合集中式日志系统 - 健康检查失败
- 查看docker inspect中State.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 等轮转文件。
通过规范化日志与状态查看流程,可以快速判断容器故障类型并缩短恢复时间,为后续自动化监控与告警打下基础。