📚前言
👀回顾,系统学习docker系列已发布内容:
【docker基础】第三课:镜像管理与Dockerfile基础
【docker基础】第五课:Docker网络详解-CSDN博客
【docker基础】第六课:Web应用与数据库容器部署-CSDN博客
【docker基础】 第七课:Docker Compose 多容器实战-CSDN博客
🔗相关文档:
【docker基础】Ubuntu 安装 Docker 超详细小白教程
📒本课学习目标:
- 容器监控 :使用
docker stats和docker inspect - 健康检查:在 Dockerfile 中配置 HEALTHCHECK
- 日志管理:查看日志、配置日志驱动、日志轮转
- 更新策略:滚动更新、蓝绿部署、金丝雀部署
- 资源清理:清理停止的容器、未使用的镜像和数据卷
🌍Docker第八周:容器监控与应用更新策略
欢迎来到 Docker 第八周的学习!本周我们将学习容器监控、日志管理和应用更新策略,这些是生产环境中非常重要的技能。
第一章:容器监控
1.1 为什么需要监控
在生产环境中,我们需要实时了解容器的运行状态:
- 资源使用情况:CPU、内存、磁盘、网络
- 运行状态:是否正常运行、是否崩溃
- 性能指标:响应时间、吞吐量
1.2 docker stats - 实时资源监控
功能:实时查看容器的资源使用情况
命令格式:
docker stats [容器名称/ID]
示例:
docker stats
输出解释:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
abc123 mynginx 0.00% 2.562MiB / 1.946GiB 0.13% 648B / 0B 0B / 0B 2
def456 mymysql 0.01% 156.2MiB / 1.946GiB 7.82% 1.23kB / 852B 0B / 0B 37
字段说明:
| 字段 | 说明 |
|---|---|
CONTAINER ID |
容器ID |
NAME |
容器名称 |
CPU % |
CPU使用率 |
MEM USAGE / LIMIT |
内存使用/限制 |
MEM % |
内存使用率 |
NET I/O |
网络输入/输出 |
BLOCK I/O |
磁盘输入/输出 |
PIDS |
进程数量 |
常用选项:
# 只显示指定容器
docker stats mynginx mymysql
# 以精简模式显示
docker stats --format "{{.Name}} {{.CPUPerc}} {{.MemUsage}}"
# 不循环显示(只显示一次)
docker stats --no-stream
1.3 docker inspect - 容器详细信息
功能:查看容器的详细配置和状态信息
示例:
docker inspect mynginx
关键信息解读:
Id:容器IDName:容器名称State:运行状态(Running/Stopped)NetworkSettings:网络配置Mounts:挂载信息
过滤特定信息:
# 只查看IP地址
docker inspect --format '{{.NetworkSettings.IPAddress}}' mynginx
# 查看容器状态
docker inspect --format '{{.State.Status}}' mynginx
1.4 HEALTHCHECK - 健康检查
功能:HEALTHCHECK 是 Docker 提供的一种机制,用于 持续监控容器内部应用的健康状态 。它会定期执行指定的检查命令,根据命令的退出码判断容器是否健康。
健康检查的本质
健康检查的本质是通过执行命令来验证服务是否正常运行:
容器内运行的服务
↓
定期执行检查命令(如 curl、wget、自定义脚本)
↓
根据命令退出码判断状态:
- 退出码 0 → 健康 (healthy)
- 退出码非0 → 不健康 (unhealthy)
退出码规则
| 退出码 | 含义 | 容器状态 |
|---|---|---|
0 |
检查通过 | healthy |
1 |
检查失败 | unhealthy |
2 |
保留值(不使用) | - |
完整工作流程
┌─────────────────────────────────────────────────────────────────┐
│ HEALTHCHECK 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 容器启动 │
│ ↓ │
│ 2. 等待 start_period(默认0秒) │
│ ↓ │
│ 3. 第1次健康检查 │
│ ↓ │
│ ┌─────────────────────┐ │
│ │ 检查命令执行成功? │ │
│ └─────────┬───────────┘ │
│ │ │
│ ┌─────┴─────┐ │
│ ↓ ↓ │
│ 是(0) 否(非0) │
│ ↓ ↓ │
│ 标记为 等待 interval │
│ healthy ↓ │
│ 第2次检查 │
│ ↓ │
│ 重试次数 < retries? │
│ ↓ │
│ ┌─────┴─────┐ │
│ ↓ ↓ │
│ 是(重试) 否(放弃) │
│ ↓ ↓ │
│ 继续检查 标记为 unhealthy │
│ ↓ │
│ 触发重启/告警/移除 │
│ │
└─────────────────────────────────────────────────────────────────┘
在 Dockerfile 中添加健康检查:
FROM nginx:latest
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
工作流程:
容器启动
↓
等待一段时间(默认0秒)
↓
每隔5秒执行一次健康检查
↓
如果检查超过3秒没有响应 → 判定为失败
参数说明:
| 参数 | 说明 |
|---|---|
--interval |
检查间隔(默认30秒) |
--timeout |
超时时间(默认30秒) |
--retries |
重试次数(默认3次) |
--start-period |
启动等待时间(默认0秒) |
查看健康状态:
docker ps
# 健康状态说明:
# healthy - 健康
# unhealthy - 不健康
# starting - 启动中
示例:
# 查看容器列表(包含健康状态)
docker ps
# 输出示例
CONTAINER ID IMAGE STATUS PORTS
abc123 nginx:latest Up 10 seconds (healthy) 0.0.0.0:80->80/tcp
def456 nginx:latest Up 5 minutes (unhealthy) 0.0.0.0:8080->80/tcp
第二章:容器日志管理
2.1 docker logs - 查看日志
功能:查看容器的日志输出
基本用法:
docker logs [选项] 容器名称/ID
示例:
# 查看所有日志
docker logs mynginx
# 实时跟踪日志(类似 tail -f)
docker logs -f mynginx
# 只显示最后100行
docker logs --tail 100 mynginx
# 显示时间戳
docker logs -t mynginx
2.2 日志驱动配置
Docker 支持多种日志驱动:
| 驱动 | 说明 |
|---|---|
json-file |
默认驱动,日志以JSON格式存储 |
syslog |
发送到syslog服务器 |
journald |
发送到systemd journal |
gelf |
发送到Graylog或Logstash |
fluentd |
发送到Fluentd |
配置日志驱动:
# 运行容器时指定日志驱动
docker run -d --log-driver=syslog nginx
# 配置默认日志驱动(修改daemon.json)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
2.3 日志轮转配置
防止日志文件过大:
docker run -d \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
参数说明:
max-size:单个日志文件最大大小(10m = 10MB)max-file:最多保留几个日志文件
第三章:应用更新策略
3.1 滚动更新(Rolling Update)
概念:逐步更新容器,保证服务不中断
步骤:
- 拉取新镜像
- 停止旧容器
- 启动新容器
- 等待健康检查通过
- 重复直到所有容器更新完成
使用 Docker Compose 进行滚动更新:
version: '3.8'
services:
web:
image: myapp:latest
deploy:
replicas: 3
update_config:
parallelism: 1 # 每次更新1个容器
delay: 10s # 更新间隔10秒
failure_action: rollback # 更新失败时回滚
📌在Docker Compose 配置文件中,用于定义一个名为 web 的服务,并配置了 滚动更新策略 :
- replicas: 3 表示运行 3 个相同的容器,这些容器会自动分布在集群的不同节点上,增加副本数可以提高服务的可用性和负载能
- update_config 定义了当服务需要更新时的行为
-- parallelism: 1 表示每次只更新 1 个容器,这样可以保证在更新过程中,至少有部分容器正常运行
-- delay: 10s 表示每次更新一个容器后,等待 10 秒再更新下一个,这个等待时间用于验证新容器是否正常运行,如果新容器在等待期间出现问题,可以及时发现并停止更新
-- failure_action: rollback 表示如果更新失败,自动回滚到之前的版本,其他可选值: continue (继续更新)、 pause (暂停更新)
执行更新:
# 更新镜像
docker-compose pull web
# 重新启动服务
docker-compose up -d --no-deps web
3.2 蓝绿部署(Blue-Green Deployment)
概念:同时运行两个版本的应用,切换流量
步骤:
- 部署蓝色环境(当前版本)
- 部署绿色环境(新版本)
- 测试绿色环境
- 切换流量到绿色环境
- 如果有问题,切换回蓝色环境
示例:
# 启动蓝色环境
docker run -d --name web-blue -p 8080:80 myapp:v1
# 启动绿色环境
docker run -d --name web-green -p 8081:80 myapp:v2
# 测试绿色环境
curl http://localhost:8081
# 切换流量(修改Nginx配置或负载均衡)
# 将流量从8080切换到8081
# 如果有问题,切换回蓝色环境
3.3 金丝雀部署(Canary Deployment)
概念:先让一小部分用户使用新版本
步骤:
- 部署新版本到少数服务器
- 让小部分流量流向新版本
- 监控新版本的性能和错误率
- 如果没问题,逐步扩大范围
- 最后完全切换到新版本
示例:
# 启动旧版本(3个实例)
docker-compose up -d --scale web=3
# 启动新版本(1个实例)
docker run -d --name web-canary myapp:v2
# 配置负载均衡,将10%流量导向canary
# 监控canary的日志和指标
# 如果没问题,逐步增加canary实例数量
第四章:实战练习
4.1 练习1:监控容器资源使用
# 启动多个容器
docker run -d --name nginx1 nginx
docker run -d --name nginx2 nginx
docker run -d --name nginx3 nginx
# 查看资源使用情况
docker stats
# 查看特定容器的详细信息
docker inspect nginx1
# 停止容器
docker stop nginx1 nginx2 nginx3
docker rm nginx1 nginx2 nginx3
4.2 练习2:配置健康检查
创建带健康检查的 Dockerfile:
FROM nginx:latest
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
构建并运行:
docker build -t nginx-health .
docker run -d --name health-test nginx-health
# 查看健康状态
docker ps
4.3 练习3:使用 Docker Compose 进行滚动更新
创建 docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 5s
failure_action: rollback
启动服务:
docker-compose up -d
# 查看运行的容器
docker-compose ps
# 更新镜像
docker-compose pull web
# 执行滚动更新
docker-compose up -d --no-deps web
第五章:容器清理与资源管理
5.1 清理停止的容器
# 删除所有停止的容器
docker container prune
# 删除指定容器
docker rm mycontainer
5.2 清理未使用的镜像
# 删除未被任何容器使用的镜像
docker image prune
# 删除所有未使用的镜像(包括有标签的)
docker image prune -a
5.3 清理数据卷
# 删除未被任何容器使用的数据卷
docker volume prune
5.4 清理网络
# 删除未被任何容器使用的网络
docker network prune
5.5 一键清理所有资源
# 清理所有未使用的资源
docker system prune
# 清理所有资源(包括已停止的容器)
docker system prune -a
第六章:常见问题与解决方案
6.1 问题:容器内存使用过高
解决方案:
# 限制容器内存使用
docker run -d --memory=512m nginx
# 查看内存使用
docker stats
6.2 问题:日志文件过大
解决方案:
# 配置日志轮转
docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
6.3 问题:容器启动失败
解决方案:
# 查看容器日志
docker logs mycontainer
# 查看容器状态
docker inspect mycontainer
# 查看最近启动失败的容器
docker ps -a --filter "status=exited"
本周总结
本周我们学习了:
- 容器监控 :使用
docker stats和docker inspect - 健康检查:在 Dockerfile 中配置 HEALTHCHECK
- 日志管理:查看日志、配置日志驱动、日志轮转
- 更新策略:滚动更新、蓝绿部署、金丝雀部署
- 资源清理:清理停止的容器、未使用的镜像和数据卷
练习作业:
- 创建一个带健康检查的容器并验证
- 配置日志轮转
- 使用 Docker Compose 练习滚动更新