Docker 容器编排与 Swarm

Docker Swarm

Docker原生的容器编排平台,将多个Docker主机集群化为一个虚拟系统,实现高可用和弹性扩展。

容器编排 集群管理 服务发现 负载均衡

什么是容器编排?

容器编排 是指自动化容器的部署、管理、扩展和网络连接的流程。在微服务架构中,通常需要运行多个容器实例,编排工具帮助管理这些容器的生命周期。

Docker Swarm是Docker官方提供的容器编排工具,内置在Docker引擎中,无需额外安装。

主要编排功能包括:

  • 集群管理和节点发现
  • 服务部署和伸缩
  • 负载均衡和服务发现
  • 滚动更新和回滚
  • 故障恢复和自愈
为什么需要容器编排?
  • 管理大规模容器部署
  • 实现高可用性
  • 自动化故障恢复
  • 简化应用部署流程
  • 优化资源利用率
主要编排工具对比
  • Docker Swarm - Docker原生,简单易用
  • Kubernetes - 功能强大,生态丰富
  • Apache Mesos - 资源调度,支持多种工作负载
  • Nomad - HashiCorp产品,简单灵活

Docker Swarm 核心概念

节点 (Nodes)

Swarm集群中的Docker主机,分为管理节点和工作节点。

管理节点 工作节点

服务 (Services)

要执行的任务的定义,包括使用的镜像、副本数量、网络配置等。

副本服务 全局服务

任务 (Tasks)

服务调度的原子单位,一个任务对应一个运行的容器。

容器实例 调度单元

Swarm 网络

Overlay网络实现跨主机容器通信,ingress网络处理外部流量。

Overlay Ingress

集群存储

数据卷和配置对象,用于持久化存储和配置管理。

数据卷 配置对象

Swarm 节点类型

管理节点 (Manager Nodes)

管理节点负责集群管理任务,维护集群状态,调度服务,并充当集群的HTTP API端点。

管理节点职责
  • 维护集群状态
  • 调度服务
  • 服务发现和负载均衡
  • 处理HTTP API请求
  • Raft一致性算法维护
管理节点最佳实践
  • 生产环境至少部署3或5个管理节点以实现高可用
  • 管理节点数量应为奇数(1、3、5、7)
  • 避免在工作节点上运行繁重的工作负载
  • 定期备份Swarm集群状态

工作节点 (Worker Nodes)

工作节点接收并执行从管理节点调度的任务,运行实际的容器工作负载。

工作节点职责
  • 运行容器实例
  • 向管理节点报告状态
  • 执行管理节点调度的任务
工作节点扩展
  • 可以根据需要动态添加或移除工作节点
  • 工作节点故障时,任务会自动重新调度到其他节点
  • 支持异构环境(不同配置的节点)

Swarm 集群架构

Swarm 集群架构示意图

Manager 1
Leader
Manager 2
Reachable
Manager 3
Reachable
Worker 1
Running Tasks
Worker 2
Running Tasks
Worker 3
Running Tasks
Worker 4
Running Tasks

创建和管理 Swarm 集群

1
初始化Swarm集群

在第一台机器上初始化Swarm,创建管理节点

2
添加管理节点

添加更多管理节点以实现高可用

3
添加工作节点

添加工作节点以扩展计算能力

4
部署服务

在集群中部署和管理服务

初始化Swarm集群


# 在第一个节点上初始化Swarm(管理节点)
docker swarm init --advertise-addr <MANAGER-IP>

# 输出示例:
# Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
#
# To add a worker to this swarm, run the following command:
#
#    docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377
#
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
                    

添加节点到集群


# 获取添加工作节点的令牌
docker swarm join-token worker

# 获取添加管理节点的令牌
docker swarm join-token manager

# 在工作节点上运行加入命令
docker swarm join --token <WORKER-TOKEN> <MANAGER-IP>:2377

# 在管理节点上运行加入命令
docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:2377
                    

查看集群状态


# 查看所有节点
docker node ls

# 查看节点详情
docker node inspect <NODE-ID>

# 查看服务列表
docker service ls

# 查看服务详情
docker service inspect <SERVICE-NAME>
                    

服务管理和部署

服务部署和扩展

创建服务

# 创建简单服务
docker service create --name web --replicas 3 -p 80:80 nginx

# 创建服务并指定网络
docker service create --name api --network my-network --replicas 5 my-api:latest

# 创建全局服务(每个节点运行一个实例)
docker service create --name global-app --mode global nginx
                        
服务伸缩

# 扩展服务副本数量
docker service scale web=5

# 或者使用update命令
docker service update --replicas 10 web

# 缩减服务副本数量
docker service scale web=2
                        
服务更新和回滚

# 更新服务镜像
docker service update --image my-app:2.0 web

# 滚动更新配置
docker service update \
  --update-parallelism 2 \
  --update-delay 10s \
  --image my-app:2.0 \
  web

# 回滚到上一个版本
docker service update --rollback web
                        

Swarm 网络

Swarm 网络架构

Overlay 网络

Overlay网络允许不同节点上的容器相互通信,就像它们在同一个网络上一样。


# 创建Overlay网络
docker network create -d overlay my-overlay-net

# 在服务中使用Overlay网络
docker service create \
  --name my-service \
  --network my-overlay-net \
  --replicas 3 \
  my-app:latest
                        
Ingress 网络

Ingress网络是特殊的Overlay网络,用于处理从外部到Swarm服务的流量。


# 发布服务端口(自动使用Ingress网络)
docker service create \
  --name web \
  --publish published=80,target=80 \
  --replicas 3 \
  nginx
                        

Stack 部署

使用Stack部署应用

Stack允许使用Compose文件在Swarm集群中部署完整的应用程序栈。

docker-compose.yml for Swarm

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: ingress
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
    networks:
      - webnet

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - node.role == manager
    networks:
      - webnet

networks:
  webnet:
                        
部署Stack

# 部署Stack
docker stack deploy -c docker-compose.yml myapp

# 查看Stack服务
docker stack services myapp

# 查看Stack详情
docker stack ps myapp

# 删除Stack
docker stack rm myapp
                        

编排工具对比

特性 Docker Swarm Kubernetes Docker Compose
学习曲线 简单 陡峭 简单
集群规模 中小型 大型 单机
安装复杂度 低(内置)
高可用性 内置 内置
自动伸缩 基础 高级
服务发现 内置DNS 内置DNS 容器名称
适用场景 简单集群 企业级 开发测试

最佳实践

管理节点高可用

在生产环境中部署奇数个管理节点(3或5个),确保集群管理的高可用性。

资源限制和预留

为服务设置适当的资源限制和预留,防止单个服务消耗过多资源影响其他服务。


deploy:
  resources:
    limits:
      cpus: '0.50'
      memory: 512M
    reservations:
      cpus: '0.25'
      memory: 256M
                        
健康检查配置

为服务配置适当的健康检查,确保Swarm能够正确检测服务状态并进行故障恢复。


healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s
                        
滚动更新策略

配置适当的滚动更新策略,确保服务更新过程中保持可用性。


deploy:
  update_config:
    parallelism: 2
    delay: 10s
    order: start-first
    failure_action: rollback
                        
节点标签和约束

使用节点标签和服务约束控制服务调度,确保服务运行在合适的节点上。


# 为节点添加标签
docker node update --label-add disk=ssd node1

# 在服务中使用节点约束
docker service create \
  --name cache \
  --constraint node.labels.disk==ssd \
  redis:alpine
                        

常见问题与解决方案

问题描述: 工作节点无法加入Swarm集群。

解决方案:

  • 检查网络连接和防火墙设置
  • 确保使用正确的加入令牌
  • 验证管理节点IP地址和端口(默认2377)
  • 检查Docker版本兼容性
  • 查看Docker守护进程日志

# 检查Docker守护进程日志
journalctl -u docker

# 重新生成加入令牌
docker swarm join-token worker

# 检查防火墙规则
sudo ufw status
                                    

问题描述: 同一Swarm集群中的服务无法通过服务名称相互访问。

解决方案:

  • 确保服务使用相同的Overlay网络
  • 检查服务DNS解析
  • 验证网络配置和路由
  • 检查防火墙和网络安全组规则

# 检查服务网络配置
docker service inspect --format='{\{.Spec.TaskTemplate.Networks}}' service-name

# 测试服务间DNS解析
docker exec -it container-name nslookup service-name

# 创建共享的Overlay网络
docker network create -d overlay shared-net
                                    

问题描述: Swarm管理节点故障导致集群管理功能受影响。

解决方案:

  • 确保有足够的管理节点(推荐3或5个)
  • 从剩余的管理节点提升新的Leader
  • 恢复故障节点或添加新的管理节点
  • 定期备份Swarm集群状态

# 查看当前集群状态
docker node ls

# 提升工作节点为管理节点
docker node promote worker-node-name

# 从集群中移除故障节点
docker node rm failed-node-name

# 备份Swarm配置
docker swarm init --force-new-cluster
                                    
Swarm掌握!

恭喜!您已经掌握了Docker Swarm容器编排的核心知识。现在可以构建和管理高可用的容器化应用程序集群。