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

📅 2026/7/12 11:48:51 👁️ 阅读次数 📝 编程学习
第五部分-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 和内存控制
  • 健康检查:自动故障恢复