28. 服务管理1. 服务管理概述Docker Swarm 中的服务Service是容器在集群中的抽象。服务定义了容器的镜像、端口、副本数等配置Swarm 负责确保服务始终按预期运行。┌─────────────────────────────────────────────────────────────┐ │ Swarm 服务架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Service │ │ │ │ (web: nginx, replicas3) │ │ │ └─────────────────────────┬───────────────────────────┘ │ │ │ │ │ ┌───────────────────┼───────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ 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\--mounttypevolume,srcweb-data,dst/usr/share/nginx/html\--replicas3\nginx2.2 全局服务Global Service# 每个节点运行一个副本dockerservicecreate--namemonitor\--modeglobal\prom/node-exporter# 全局服务 约束dockerservicecreate--namelog-agent\--modeglobal\--constraintnode.labels.logtrue\fluent/fluentd2.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:latest3. 服务扩缩容3.1 手动扩缩容# 扩容到 5 个副本dockerservicescaleweb5# 缩容到 2 个副本dockerservicescaleweb2# 使用 update 命令dockerserviceupdate--replicas5web# 同时扩缩多个服务dockerservicescaleweb5api33.2 自动扩缩容# 需要第三方工具如 Prometheus AlertManager# Swarm 本身不支持自动扩缩容4. 服务更新4.1 更新配置# 更新镜像dockerserviceupdate--imagenginx:alpine web# 更新环境变量dockerserviceupdate --env-addNODE_ENVproduction web# 删除环境变量dockerserviceupdate --env-rm NODE_ENV web# 更新端口dockerserviceupdate --publish-add8080:80 webdockerserviceupdate --publish-rm8080:80 web# 更新卷dockerserviceupdate --mount-addtypevolume,srcdata,dst/data webdockerserviceupdate --mount-rm /data web# 更新资源dockerserviceupdate --limit-cpu1webdockerserviceupdate --limit-memory 1G web4.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\app4.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--filterdesired-staterunning5. 服务约束与标签5.1 节点约束# 只在有特定标签的节点运行dockerservicecreate--namedb\--constraintnode.labels.storagessd\--replicas3\mysql# 排除特定节点dockerservicecreate--nameweb\--constraintnode.role!manager\--replicas5\nginx# 多个约束AND 关系dockerservicecreate--nameapp\--constraintnode.labels.envproduction\--constraintnode.labels.regionus-east\myapp# 软约束尽量满足dockerservicecreate--nameapp\--constraintnode.labels.gputrue\--constraintnode.labels.storagessd\--placement-prefspreadnode.labels.zone\myapp5.2 节点标签管理# 添加节点标签dockernodeupdate --label-addstoragessd node1dockernodeupdate --label-addzoneus-east node2dockernodeupdate --label-addgputrue node3# 查看节点标签dockernodeinspect node1|grepLabels-A5# 删除节点标签dockernodeupdate --label-rm storage node16. 服务发现与负载均衡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\myapi7. 服务健康检查# 创建带健康检查的服务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 \ web8. 服务日志管理# 查看服务日志dockerservicelogs webdockerservicelogs-fwebdockerservicelogs--tail100web# 查看特定任务日志dockerservicelogs--taskweb.1 web# 查看所有任务日志dockerservicelogs--tasksweb# 查看详细信息dockerservicelogs--timestamps--detailsweb# 日志驱动配置dockerservicecreate--nameweb\--log-driver json-file\--log-opt max-size10m\--log-opt max-file3\nginx9. 服务故障恢复# 重启策略dockerservicecreate--nameweb\--restart-condition on-failure\--restart-delay 5s\--restart-max-attempts3\--restart-window 120s\nginx# 更新重启策略dockerserviceupdate\--restart-condition any\--restart-delay 10s\web10. 完整服务示例#!/bin/bash# 创建完整的微服务架构# 创建网络dockernetwork create-doverlay micro-net# 数据库服务dockerservicecreate\--namedb\--networkmicro-net\--constraintnode.rolemanager\--mounttypevolume,srcdb-data,dst/var/lib/postgresql/data\-ePOSTGRES_PASSWORDsecret\--replicas1\postgres:13# Redis 缓存dockerservicecreate\--nameredis\--networkmicro-net\-eREDIS_PASSWORDredis123\--replicas1\redis:alpine# API 服务dockerservicecreate\--nameapi\--networkmicro-net\--publish8080:8080\--limit-cpu1\--limit-memory 512M\--replicas3\--update-parallelism1\--update-delay 10s\--health-cmdcurl -f http://localhost:8080/health\--health-interval 30s\myapi:latest# Web 前端dockerservicecreate\--nameweb\--networkmicro-net\--publish80:80\--replicas2\nginx# 监控代理dockerservicecreate\--namemonitor\--modeglobal\--mounttypebind,src/proc,dst/host/proc\prom/node-exporter11. 命令速查操作命令创建服务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 inspect12. 常见问题Q1: 服务一直处于 Preparing 状态检查镜像是否存在、资源限制、节点状态。Q2: 如何更新服务的环境变量使用docker service update --env-add。Q3: 服务更新后如何回滚使用docker service rollback命令。13. 小结副本服务指定运行数量全局服务每个节点运行一个扩缩容动态调整副本数滚动更新零停机更新回滚快速恢复到稳定版本约束与标签控制服务部署位置资源限制CPU 和内存控制健康检查自动故障恢复