Docker Swarm #

什么是Docker Swarm? #

Docker Swarm是Docker官方提供的容器集群管理工具,可以将多个Docker主机组成一个虚拟的Docker主机。

Swarm架构 #

text
┌─────────────────────────────────────────────────────┐
│                   Swarm 架构                         │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌─────────────────────────────────────────────┐   │
│  │              Manager Nodes                   │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐     │   │
│  │  │Manager 1│  │Manager 2│  │Manager 3│     │   │
│  │  │(Leader) │  │(Reachable)│ │(Reachable)│   │   │
│  │  └─────────┘  └─────────┘  └─────────┘     │   │
│  └─────────────────────────────────────────────┘   │
│         │              │              │             │
│         └──────────────┼──────────────┘             │
│                        │                            │
│  ┌─────────────────────▼───────────────────────┐   │
│  │              Worker Nodes                    │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐     │   │
│  │  │ Worker  │  │ Worker  │  │ Worker  │     │   │
│  │  │   1     │  │   2     │  │   3     │     │   │
│  │  └─────────┘  └─────────┘  └─────────┘     │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
└─────────────────────────────────────────────────────┘

核心概念 #

概念 说明
Node Swarm集群中的Docker主机
Service 在Swarm中运行的服务
Task 服务的单个容器实例
Stack 一组相关服务的集合

集群管理 #

初始化Swarm #

bash
# 初始化Swarm集群
docker swarm init --advertise-addr <MANAGER-IP>

# 查看加入命令
docker swarm join-token worker
docker swarm join-token manager

# 查看节点
docker node ls

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

加入集群 #

bash
# Worker节点加入
docker swarm join --token <TOKEN> <MANAGER-IP>:2377

# Manager节点加入
docker swarm join-token manager
docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:2377

节点管理 #

bash
# 查看节点
docker node ls

# 更新节点
docker node update --availability active <NODE-ID>
docker node update --availability pause <NODE-ID>
docker node update --availability drain <NODE-ID>

# 提升为Manager
docker node promote <NODE-ID>

# 降级为Worker
docker node demote <NODE-ID>

# 删除节点
docker node rm <NODE-ID>

# 离开集群
docker swarm leave
docker swarm leave --force  # Manager节点

服务管理 #

创建服务 #

bash
# 创建服务
docker service create --name web -p 80:80 nginx

# 创建带副本的服务
docker service create --name web --replicas 3 -p 80:80 nginx

# 创建带资源限制的服务
docker service create \
  --name web \
  --replicas 3 \
  --limit-cpu 0.5 \
  --limit-memory 512m \
  -p 80:80 \
  nginx

查看服务 #

bash
# 查看所有服务
docker service ls

# 查看服务详情
docker service ps web

# 查看服务日志
docker service logs web
docker service logs -f web

更新服务 #

bash
# 更新副本数
docker service scale web=5

# 更新镜像
docker service update --image nginx:alpine web

# 更新端口
docker service update --publish-rm 80 --publish-add 8080:80 web

# 更新资源限制
docker service update --limit-cpu 1 --limit-memory 1g web

# 滚动更新
docker service update \
  --image nginx:latest \
  --update-parallelism 2 \
  --update-delay 10s \
  web

删除服务 #

bash
# 删除服务
docker service rm web

服务配置 #

完整服务配置 #

bash
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  --mount type=volume,source=data,target=/data \
  --env NODE_ENV=production \
  --env DB_HOST=db \
  --network app-network \
  --constraint node.role==worker \
  --limit-cpu 0.5 \
  --limit-memory 512m \
  --reserve-cpu 0.25 \
  --reserve-memory 256m \
  --restart-condition on-failure \
  --restart-delay 10s \
  --restart-max-attempts 3 \
  --update-parallelism 1 \
  --update-delay 10s \
  --update-failure-action rollback \
  nginx:alpine

环境变量 #

bash
# 设置环境变量
docker service create \
  --name app \
  --env NODE_ENV=production \
  --env DB_HOST=db \
  --env-file .env \
  myapp

Secrets管理 #

bash
# 创建secret
echo "my_password" | docker secret create db_password -

# 使用secret
docker service create \
  --name db \
  --secret db_password \
  -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_password \
  mysql:8.0

Configs管理 #

bash
# 创建config
docker config create nginx_config nginx.conf

# 使用config
docker service create \
  --name web \
  --config source=nginx_config,target=/etc/nginx/nginx.conf \
  -p 80:80 \
  nginx

Stack部署 #

docker-compose.yml #

yaml
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    networks:
      - frontend
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  app:
    image: myapp
    networks:
      - frontend
      - backend
    deploy:
      replicas: 2
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

  db:
    image: mysql:8.0
    networks:
      - backend
    volumes:
      - db-data:/var/lib/mysql
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager

networks:
  frontend:
  backend:

volumes:
  db-data:

部署Stack #

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

# 查看stack
docker stack ls

# 查看stack服务
docker stack services myapp

# 查看stack任务
docker stack ps myapp

# 删除stack
docker stack rm myapp

网络管理 #

创建Overlay网络 #

bash
# 创建overlay网络
docker network create --driver overlay my-network

# 创建加密网络
docker network create --driver overlay --opt encrypted my-network

# 查看网络
docker network ls

服务使用网络 #

bash
# 创建网络
docker network create --driver overlay app-network

# 服务使用网络
docker service create \
  --name web \
  --network app-network \
  -p 80:80 \
  nginx

负载均衡 #

Swarm内置负载均衡 #

bash
# Swarm自动负载均衡
# 服务副本自动分配到不同节点
# 通过任意节点IP访问服务

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

# 访问任意节点IP
curl http://node1:80
curl http://node2:80
curl http://node3:80

路由网格 #

text
┌─────────────────────────────────────────────────────┐
│                   路由网格                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│  请求 ──→ 任意节点 ──→ 路由网格 ──→ 服务副本       │
│                                                     │
│  Node1 (80) ──┐                                     │
│               │                                     │
│  Node2 (80) ──┼──→ 负载均衡 ──→ Web1, Web2, Web3  │
│               │                                     │
│  Node3 (80) ──┘                                     │
│                                                     │
└─────────────────────────────────────────────────────┘

小结 #

本节学习了Docker Swarm集群编排:

  • Swarm架构和核心概念
  • 集群管理操作
  • 服务管理操作
  • Stack部署方式
  • 网络和负载均衡

下一步 #

接下来,让我们学习 安全最佳实践,了解Docker的安全配置方法。