当前位置: 首页 > news >正文

Systemd构建容器化微服务集群管理系统

在这里插入图片描述

实训背景

你是一家云计算公司的 DevOps 工程师,需为某客户设计一套基于 Docker 的微服务集群管理系统,需求如下:

  1. 容器自启管理:确保三个服务(webappapiredis)在系统启动时自动运行。
  2. 依赖顺序控制redis 必须在 api 之前启动,api 必须在 webapp之前启动。
  3. 健康检查与自愈:若 webapp 崩溃,10秒内自动重启。
  4. 资源隔离:限制 redis 容器最多使用 1GB 内存和 2 核 CPU。

环境准备

  1. 操作系统:Ubuntu 22.04 LTS。
  2. 软件依赖
    sudo apt install docker.io
    sudo systemctl enable docker  # 启用 Docker 服务
    
  3. 镜像准备
    docker pull nginx:alpine      # 模拟 webapp
    docker pull node:18          # 模拟 api
    docker pull redis:7          # 数据库
    

实训步骤


任务1:定义容器服务单元文件

目标:为每个容器创建独立的 systemd 服务文件。

操作步骤
  1. 创建 redis 服务文件

    sudo nano /etc/systemd/system/redis-container.service
    

    内容:

    [Unit]
    Description=Redis Container
    After=docker.service
    Requires=docker.service
    
    [Service]
    Type=simple
    Restart=always
    ExecStartPre=-/usr/bin/docker rm -f redis  # 清理旧容器
    ExecStart=/usr/bin/docker run --name redis \
               --memory="1g" --cpus="2.0" \    # 资源限制
               redis:7
    ExecStop=/usr/bin/docker stop redis
    
    [Install]
    WantedBy=multi-user.target
    
  2. 创建 api 服务文件

    sudo nano /etc/systemd/system/api-container.service
    

    内容:

    [Unit]
    Description=API Container
    After=redis-container.service  # 依赖 Redis
    Requires=redis-container.service
    
    [Service]
    Type=simple
    Restart=on-failure
    ExecStartPre=-/usr/bin/docker rm -f api
    ExecStart=/usr/bin/docker run --name api \
               --link redis:redis \           # 连接 Redis
               node:18 npm start
    ExecStop=/usr/bin/docker stop api
    
  3. 创建 webapp 服务文件

    sudo nano /etc/systemd/system/webapp-container.service
    

    内容:

    [Unit]
    Description=WebApp Container
    After=api-container.service    # 依赖 API
    Requires=api-container.service
    
    [Service]
    Type=notify                    # 等待健康检查信号
    Restart=always
    RestartSec=10                  # 崩溃后等待10秒重启
    ExecStartPre=-/usr/bin/docker rm -f webapp
    ExecStart=/usr/bin/docker run --name webapp \
               --link api:api \              # 连接 API
               -p 80:80 \
               nginx:alpine
    ExecStop=/usr/bin/docker stop webapp
    
    [Install]
    WantedBy=multi-user.target
    

任务2:配置服务依赖与启动顺序

目标:确保服务按 redis → api → webapp 顺序启动。

操作步骤
  1. 验证依赖关系

    systemctl list-dependencies webapp-container.service  # 查看依赖链
    
  2. 手动测试启动顺序

    sudo systemctl stop docker
    sudo systemctl start redis-container api-container webapp-container
    journalctl -f  # 观察启动顺序是否符合预期
    

任务3:实现健康检查与自愈

目标:当 webapp 容器崩溃时自动重启。

操作步骤
  1. 修改 webapp 服务文件
    [Service] 部分添加:

    Restart=always
    RestartSec=10
    TimeoutStartSec=300  # 等待容器启动的最长时间
    
  2. 模拟崩溃测试

    sudo docker kill webapp        # 手动杀死容器
    systemctl status webapp-container.service  # 观察是否重启
    journalctl -u webapp-container.service | grep "Starting container"
    

任务4:应用资源限制

目标:限制 redis 容器资源使用。

操作步骤
  1. 修改 redis 服务文件
    ExecStart 中已包含 --memory="1g" --cpus="2.0"

  2. 验证资源限制

    docker stats redis  # 查看实时资源占用
    stress-ng --vm 2 --vm-bytes 800M  # 在容器内运行压力测试
    

实训总结

通过本次实训,你实现了以下功能:

  1. 容器生命周期管理:通过 systemd 控制 Docker 容器的启动、停止和重启。
  2. 服务依赖链:确保微服务按正确顺序初始化。
  3. 故障自愈:结合 Restart 策略实现服务高可用。
  4. 资源隔离:防止单个容器耗尽系统资源。

知识要点

  1. Docker 与 systemd 集成

    • 使用 ExecStart 直接调用 docker run 命令。
    • 通过 --memory--cpus 限制容器资源。
  2. 服务依赖控制

    • AfterRequires 定义启动顺序和强依赖。
    • 使用 systemctl list-dependencies 可视化依赖链。
  3. 健康检查机制

    • Type=notify 等待容器发送就绪信号。
    • RestartSec 控制重启间隔,避免频繁重启风暴。
  4. 日志调试技巧

    journalctl -u webapp-container.service --since "5 minutes ago"
    docker logs webapp  # 查看容器内部日志
    

扩展挑战

  • 为服务添加动态扩缩容逻辑(如 CPU 使用率超过 80% 时自动增加实例)。
  • 结合 systemd socket 实现 API 服务的按需启动。
  • 使用 EnvironmentFile 将容器配置(如端口号)外置到文件。

相关文章:

  • Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
  • C++之红黑树
  • JAVA EE_多线程-初阶(二)
  • 车载诊断架构 --- 整车重启先后顺序带来的思考
  • 深入理解C++中的itoa()函数 --任意进制之间转换函数
  • 【并发编程 | 第七篇】深入学习线程池(一)
  • 程序化广告行业(64/89):AdX/SSP系统广告位设置全解析
  • C++ 并发性能优化实战:提升多线程应用的效率与稳定性
  • 单调栈学习C++
  • 【备赛】使用ADC测量电压、占空比
  • 关联容器-模板类pair数对
  • [oeasy]082_list_列表类_空列表
  • 【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解
  • 算法竞赛备赛——【图论】链式前向星
  • 回表, 覆盖索引,索引下推简述
  • 混凝土强度预测工程实践
  • ASRank: Zero-Shot Re-Ranking with Answer Scent for DocumentRetrieval
  • 蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
  • TRPO和PPO算法详解
  • C++单例模式
  • 用python做网站不常见/seo查询站长工具
  • 特克斯与凯科斯群岛域名官方网站/免费发布广告
  • 南宁手机企业网站定制公司/怎么联系百度客服人工服务
  • 贵阳网站建设方舟网络/软文投放平台有哪些?
  • 国家信用信息企业公示系统官网/windows优化大师靠谱吗
  • 网站制作教程步骤/seo研究中心倒闭