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

第五部分-DockerCompose——28. 服务管理

28. 服务管理

1. 服务管理概述

Docker Swarm 中的服务(Service)是容器在集群中的抽象。服务定义了容器的镜像、端口、副本数等配置,Swarm 负责确保服务始终按预期运行。

┌─────────────────────────────────────────────────────────────┐ │ Swarm 服务架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Service │ │ │ │ (web: nginx, replicas=3) │ │ │ └─────────────────────────┬───────────────────────────┘ │ │ │ │ │ ┌───────────────────┼───────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Task │ │ Task │ │ Task │ │ │ │ (nginx:1) │ │ (nginx:2) │ │ (nginx:3) │ │ │ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Container │ │ Container │ │ Container │ │ │ │ (nginx) │ │ (nginx) │ │ (nginx) │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ 服务类型: │ │ - 副本服务(replicated):指定副本数量 │ │ - 全局服务(global):每个节点运行一个副本 │ │ │ └─────────────────────────────────────────────────────────────┘

2. 创建服务

2.1 副本服务(Replicated Service)

# 创建基础副本服务dockerservicecreate--nameweb--replicas3nginx# 指定容器名模板dockerservicecreate--nameweb\--replicas3\--nameweb.{{.Task.Slot}}\nginx# 创建服务并映射端口dockerservicecreate--nameweb\--publish8080:80\--replicas3\nginx# 创建服务并指定网络dockernetwork create-doverlay app-netdockerservicecreate--nameweb\--networkapp-net\--replicas3\nginx# 创建服务并挂载卷dockerservicecreate--nameweb\--mounttype=volume,src=web-data,dst=/usr/share/nginx/html\--replicas3\nginx

2.2 全局服务(Global Service)

# 每个节点运行一个副本dockerservicecreate--namemonitor\--modeglobal\prom/node-exporter# 全局服务 + 约束dockerservicecreate--namelog-agent\--modeglobal\--constraintnode.labels.log==true\fluent/fluentd

2.3 资源配置

# CPU 和内存限制dockerservicecreate--nameapp\--limit-cpu0.5\--limit-memory 512M\--reserve-cpu0.25\--reserve-memory 256M\--replicas3\myapp:latest# 详细资源限制dockerservicecreate--nameapp\--limit-cpu2\--limit-memory 2G\--reserve-cpu1\--reserve-memory 1G\myapp:latest

3. 服务扩缩容

3.1 手动扩缩容

# 扩容到 5 个副本dockerservicescaleweb=5# 缩容到 2 个副本dockerservicescaleweb=2# 使用 update 命令dockerserviceupdate--replicas5web# 同时扩缩多个服务dockerservicescaleweb=5api=3

3.2 自动扩缩容

# 需要第三方工具(如 Prometheus + AlertManager)# Swarm 本身不支持自动扩缩容

4. 服务更新

4.1 更新配置

# 更新镜像dockerserviceupdate--imagenginx:alpine web# 更新环境变量dockerserviceupdate --env-addNODE_ENV=production web# 删除环境变量dockerserviceupdate --env-rm NODE_ENV web# 更新端口dockerserviceupdate --publish-add8080:80 webdockerserviceupdate --publish-rm8080:80 web# 更新卷dockerserviceupdate --mount-addtype=volume,src=data,dst=/data webdockerserviceupdate --mount-rm /data web# 更新资源dockerserviceupdate --limit-cpu1webdockerserviceupdate --limit-memory 1G web

4.2 滚动更新配置

# 创建带滚动更新配置的服务dockerservicecreate\--nameapp\--replicas10\--update-parallelism2\# 同时更新 2 个--update-delay 10s\# 批次间隔 10 秒--update-failure-action pause\# 失败时暂停--update-monitor 30s\# 监控时间--update-order start-first\# 先启动新再停止旧myapp:1.0# 更新时使用不同配置dockerserviceupdate\--imagemyapp:2.0\--update-parallelism1\--update-delay 15s\app

4.3 回滚

# 自动回滚配置dockerservicecreate\--nameapp\--replicas5\--rollback-parallelism1\--rollback-delay 5s\--rollback-failure-action pause\--rollback-monitor 30s\--rollback-order stop-first\myapp:1.0# 手动回滚到上一个版本dockerservicerollback app# 回滚到指定版本dockerserviceupdate--rollbackapp# 查看回滚状态dockerservicepsapp--filter"desired-state=running"

5. 服务约束与标签

5.1 节点约束

# 只在有特定标签的节点运行dockerservicecreate--namedb\--constraintnode.labels.storage==ssd\--replicas3\mysql# 排除特定节点dockerservicecreate--nameweb\--constraintnode.role!=manager\--replicas5\nginx# 多个约束(AND 关系)dockerservicecreate--nameapp\--constraintnode.labels.env==production\--constraintnode.labels.region==us-east\myapp# 软约束(尽量满足)dockerservicecreate--nameapp\--constraintnode.labels.gpu==true\--constraintnode.labels.storage==ssd\--placement-pref'spread=node.labels.zone'\myapp

5.2 节点标签管理

# 添加节点标签dockernodeupdate --label-addstorage=ssd node1dockernodeupdate --label-addzone=us-east node2dockernodeupdate --label-addgpu=true node3# 查看节点标签dockernodeinspect node1|grepLabels-A5# 删除节点标签dockernodeupdate --label-rm storage node1

6. 服务发现与负载均衡

6.1 服务发现

# 创建网络dockernetwork create-doverlay app-net# 创建服务dockerservicecreate--nameapi--networkapp-net--replicas3myapidockerservicecreate--nameweb--networkapp-net--replicas2nginx# web 服务可以通过 api 服务名访问# DNS 解析返回服务的 VIP 或 IP 列表# 查看服务的 VIPdockerserviceinspect api--format'{{.Endpoint.VirtualIPs}}'

6.2 DNS 轮询

# 默认 VIP 模式dockerservicecreate--nameapi--replicas3myapi# 使用 DNS 轮询(不推荐)dockerservicecreate--nameapi\--endpoint-mode dnsrr\--replicas3\myapi

7. 服务健康检查

# 创建带健康检查的服务docker service create \--name web \--health-cmd "curl-f http://localhost/||exit 1" \--health-interval 30s \--health-timeout 10s \--health-retries 3 \--health-start-period 40s \--replicas 3 \ nginx# 更新健康检查docker service update \--health-cmd "curl-f http://localhost/health" \--health-interval 15s \ web

8. 服务日志管理

# 查看服务日志dockerservicelogs webdockerservicelogs-fwebdockerservicelogs--tail100web# 查看特定任务日志dockerservicelogs--taskweb.1 web# 查看所有任务日志dockerservicelogs--tasksweb# 查看详细信息dockerservicelogs--timestamps--detailsweb# 日志驱动配置dockerservicecreate--nameweb\--log-driver json-file\--log-opt max-size=10m\--log-opt max-file=3\nginx

9. 服务故障恢复

# 重启策略dockerservicecreate--nameweb\--restart-condition on-failure\--restart-delay 5s\--restart-max-attempts3\--restart-window 120s\nginx# 更新重启策略dockerserviceupdate\--restart-condition any\--restart-delay 10s\web

10. 完整服务示例

#!/bin/bash# 创建完整的微服务架构# 创建网络dockernetwork create-doverlay micro-net# 数据库服务dockerservicecreate\--namedb\--networkmicro-net\--constraintnode.role==manager\--mounttype=volume,src=db-data,dst=/var/lib/postgresql/data\-ePOSTGRES_PASSWORD=secret\--replicas1\postgres:13# Redis 缓存dockerservicecreate\--nameredis\--networkmicro-net\-eREDIS_PASSWORD=redis123\--replicas1\redis:alpine# API 服务dockerservicecreate\--nameapi\--networkmicro-net\--publish8080:8080\--limit-cpu1\--limit-memory 512M\--replicas3\--update-parallelism1\--update-delay 10s\--health-cmd"curl -f http://localhost:8080/health"\--health-interval 30s\myapi:latest# Web 前端dockerservicecreate\--nameweb\--networkmicro-net\--publish80:80\--replicas2\nginx# 监控代理dockerservicecreate\--namemonitor\--modeglobal\--mounttype=bind,src=/proc,dst=/host/proc\prom/node-exporter

11. 命令速查

操作命令
创建服务docker service create
列出服务docker service ls
查看任务docker service ps
扩缩容docker service scale
更新服务docker service update
回滚服务docker service rollback
查看日志docker service logs
删除服务docker service rm
查看详情docker service inspect

12. 常见问题

Q1: 服务一直处于 Preparing 状态?

检查镜像是否存在、资源限制、节点状态。

Q2: 如何更新服务的环境变量?

使用docker service update --env-add

Q3: 服务更新后如何回滚?

使用docker service rollback命令。

13. 小结

  • 副本服务:指定运行数量
  • 全局服务:每个节点运行一个
  • 扩缩容:动态调整副本数
  • 滚动更新:零停机更新
  • 回滚:快速恢复到稳定版本
  • 约束与标签:控制服务部署位置
  • 资源限制:CPU 和内存控制
  • 健康检查:自动故障恢复

http://www.jsqmd.com/news/792974/

相关文章:

  • 移动支付早期体验:从技术到生态的断层与演进
  • 暗黑2角色编辑器终极指南:5分钟打造完美角色,告别刷装烦恼
  • 3个核心功能深度解析:Recaf字节码搜索的技术实践
  • 从零到一:在VS Code中高效配置MicroPython PYB开发环境与文件同步
  • 新手在 Ubuntu 上首次接入 Taotoken 并调用多模型 API 的完整指南
  • 从阿波罗返回舱到混沌工程:逆向思维如何破解工程僵局
  • 工程师的健康管理:用工程化思维解决饮食与健康难题
  • Weaviate官方示例库实战指南:从向量数据库原理到RAG应用部署
  • 关注不等于接受
  • nGPT:终端AI工具箱,无缝集成LLM提升开发效率
  • 命令行时间管理工具Groundhog:开发者效率提升利器
  • RISC-V多核SoC系统级验证:协同仿真破局软硬件协同挑战
  • 1.单位与参数基础
  • 《解压即用!Sulphur-2-GGUF文生视频、图生视频 整合包:从零开始搭建你的 AI 视频工作室》
  • 3分钟快速上手:抖音无水印下载工具完整使用指南
  • 轻量级视频稳定技术:EfficientMotionPro与OnlineSmoother解析
  • 从军工到5G:GaN制造工艺如何跨越“死亡之谷”实现产业化
  • FPGA游戏开发:硬件并行与经典游戏机仿真实战
  • Flutter for OpenHarmony 思维导图学习工具技术文章
  • EDA/IP行业动态深度解读:从验证技术到IP战略的芯片设计密码
  • Memorix:Node.js内存数据管理与实时同步库的设计与实践
  • 雀魂Mod Plus:解锁全角色与装扮的终极实施框架
  • 眼动追踪技术:DINOv3与合成数据的优化方案
  • 第五部分-DockerCompose——29. Swarm 网络
  • 模型压缩实战:剪枝、量化与蒸馏技术解析
  • Python微信机器人框架设计:插件化架构与异步消息处理实战
  • VSCode写Markdown遇到目录乱码?手把手教你搞定TOC插件和行尾符设置
  • GaN功率器件表征实战:从SOA曲线到动态测试与可靠性评估
  • React打字机动画组件:从状态机原理到工程实践
  • Godot游戏Lua模组沙盒安全集成指南