【docker基础】 第八周:容器监控与应用更新策略

📚前言

👀回顾,系统学习docker系列已发布内容:

【docker基础】0、系统学习docker之总计划

【docker基础】第一课、从零开始理解容器技术

【docker基础】第二课:安装、配置与基础命令

【docker基础】第三课:镜像管理与Dockerfile基础

【docker基础】第四课:容器操作与数据管理

【docker基础】第五课:Docker网络详解-CSDN博客

【docker基础】第六课:Web应用与数据库容器部署-CSDN博客

【docker基础】 第七课:Docker Compose 多容器实战-CSDN博客

🔗相关文档:

windows下安装docker

【docker基础】Ubuntu 安装 Docker 超详细小白教程

📒本课学习目标:

  1. 容器监控 :使用 docker statsdocker inspect
  2. 健康检查:在 Dockerfile 中配置 HEALTHCHECK
  3. 日志管理:查看日志、配置日志驱动、日志轮转
  4. 更新策略:滚动更新、蓝绿部署、金丝雀部署
  5. 资源清理:清理停止的容器、未使用的镜像和数据卷

🌍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:容器ID
  • Name:容器名称
  • 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)

概念:逐步更新容器,保证服务不中断

步骤

  1. 拉取新镜像
  2. 停止旧容器
  3. 启动新容器
  4. 等待健康检查通过
  5. 重复直到所有容器更新完成

使用 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)

概念:同时运行两个版本的应用,切换流量

步骤

  1. 部署蓝色环境(当前版本)
  2. 部署绿色环境(新版本)
  3. 测试绿色环境
  4. 切换流量到绿色环境
  5. 如果有问题,切换回蓝色环境

示例

复制代码
# 启动蓝色环境
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)

概念:先让一小部分用户使用新版本

步骤

  1. 部署新版本到少数服务器
  2. 让小部分流量流向新版本
  3. 监控新版本的性能和错误率
  4. 如果没问题,逐步扩大范围
  5. 最后完全切换到新版本

示例

复制代码
# 启动旧版本(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"

本周总结

本周我们学习了:

  1. 容器监控 :使用 docker statsdocker inspect
  2. 健康检查:在 Dockerfile 中配置 HEALTHCHECK
  3. 日志管理:查看日志、配置日志驱动、日志轮转
  4. 更新策略:滚动更新、蓝绿部署、金丝雀部署
  5. 资源清理:清理停止的容器、未使用的镜像和数据卷

练习作业

  1. 创建一个带健康检查的容器并验证
  2. 配置日志轮转
  3. 使用 Docker Compose 练习滚动更新
相关推荐
志栋智能1 小时前
超自动化巡检:如何选择适合你的起点?
运维·自动化
bloglin999991 小时前
Nginx高危漏洞CVE-2021-23017及配置样例
运维·nginx
qeen871 小时前
【Linux】Linux简单介绍与基本指令(上)
linux·运维·服务器·学习
kiros_wang2 小时前
Docker 使用完整指南
运维·docker·容器
Yana.nice2 小时前
history 显示时间戳操作(Bash)
运维
正经教主2 小时前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器
时佃鹏3 小时前
银河麒麟 V10 重装打印服务 (CUPS)+ 打印机驱动完整教程
运维·银河麒麟系统
Shepherd06193 小时前
【IT 运维】Apache 使用 mod_remoteip 恢复 Cloudflare 后的真实访客 IP
运维·tcp/ip·apache
王二端茶倒水3 小时前
智慧园区网络运营:认证、分权、运维和安全闭环
运维·物联网·架构