学习目标

通过本章学习,您将能够:

  • 了解 Docker Swarm 的系统要求和环境准备
  • 掌握 Docker 引擎的安装和配置方法
  • 学会初始化 Swarm 集群和添加节点
  • 配置网络和防火墙设置
  • 验证集群状态和基本操作

1. 系统要求和环境准备

1.1 硬件要求

最低配置

  • CPU:1 核心
  • 内存:1GB RAM
  • 存储:10GB 可用空间
  • 网络:稳定的网络连接

推荐配置

  • CPU:2 核心以上
  • 内存:4GB RAM 以上
  • 存储:50GB 可用空间
  • 网络:千兆网络连接

生产环境配置

  • CPU:4 核心以上
  • 内存:8GB RAM 以上
  • 存储:100GB+ SSD 存储
  • 网络:冗余网络连接

1.2 操作系统支持

Linux 发行版

# 支持的 Linux 发行版
Ubuntu 18.04+ (LTS)
Debian 9+
CentOS 7+
RHEL 7+
Fedora 30+
Amazon Linux 2

内核要求

# 检查内核版本
uname -r
# 要求:Linux 内核 3.10+

# 检查系统信息
lsb_release -a
cat /etc/os-release

1.3 网络要求

端口配置

# Swarm 集群必需端口
2377/tcp    # 集群管理通信
7946/tcp    # 节点间通信
7946/udp    # 节点间通信
4789/udp    # Overlay 网络流量

# 应用服务端口(根据需要开放)
80/tcp      # HTTP 服务
443/tcp     # HTTPS 服务

防火墙配置

Ubuntu/Debian (ufw)

# 开放 Swarm 端口
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp

# 开放应用端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 重新加载防火墙
sudo ufw reload
sudo ufw status

CentOS/RHEL (firewalld)

# 开放 Swarm 端口
sudo firewall-cmd --permanent --add-port=2377/tcp
sudo firewall-cmd --permanent --add-port=7946/tcp
sudo firewall-cmd --permanent --add-port=7946/udp
sudo firewall-cmd --permanent --add-port=4789/udp

# 开放应用端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp

# 重新加载防火墙
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

iptables 直接配置

# 开放 Swarm 端口
sudo iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 7946 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4789 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

2. Docker 引擎安装配置

2.1 Ubuntu/Debian 安装

使用官方脚本安装

# 下载并执行安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version
sudo docker run hello-world

手动安装步骤

# 1. 更新包索引
sudo apt-get update

# 2. 安装依赖包
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 3. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 4. 添加 Docker 仓库
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 6. 验证安装
sudo docker run hello-world

2.2 CentOS/RHEL 安装

使用 yum 安装

# 1. 卸载旧版本
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

# 2. 安装依赖
sudo yum install -y yum-utils

# 3. 添加 Docker 仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 4. 安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io

# 5. 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 6. 验证安装
sudo docker run hello-world

2.3 Docker 配置优化

配置文件设置

# 创建 Docker 配置目录
sudo mkdir -p /etc/docker

# 创建配置文件
sudo tee /etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "live-restore": true,
  "userland-proxy": false,
  "experimental": false
}
EOF

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

用户权限配置

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 重新登录或执行以下命令
newgrp docker

# 验证无需 sudo 即可运行 Docker
docker run hello-world

系统服务配置

# 设置 Docker 开机自启
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

# 检查服务状态
sudo systemctl status docker
sudo systemctl status containerd

3. 集群初始化

3.1 初始化第一个管理节点

基本初始化

# 在第一个节点上初始化 Swarm
docker swarm init

# 指定管理节点的 IP 地址
docker swarm init --advertise-addr 192.168.1.100

# 指定数据路径加密
docker swarm init --advertise-addr 192.168.1.100 --data-path-addr 192.168.1.100

高级初始化选项

# 完整的初始化命令
docker swarm init \
  --advertise-addr 192.168.1.100:2377 \
  --listen-addr 0.0.0.0:2377 \
  --data-path-addr 192.168.1.100 \
  --data-path-port 4789 \
  --default-addr-pool 10.20.0.0/16 \
  --default-addr-pool-mask-length 24 \
  --task-history-limit 10

参数说明

# 参数详解
--advertise-addr     # 通告地址,其他节点用于连接此节点
--listen-addr        # 监听地址,接受集群管理流量
--data-path-addr     # 数据路径地址,用于容器间通信
--data-path-port     # 数据路径端口,默认 4789
--default-addr-pool  # 默认地址池,用于网络分配
--task-history-limit # 任务历史记录限制

3.2 获取加入令牌

查看加入令牌

# 查看工作节点加入令牌
docker swarm join-token worker

# 查看管理节点加入令牌
docker swarm join-token manager

# 重新生成令牌
docker swarm join-token --rotate worker
docker swarm join-token --rotate manager

令牌输出示例

# 工作节点加入命令
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.1.100:2377

# 管理节点加入命令
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-dj6pjfhuaebgqgglo80ku8ytv 192.168.1.100:2377

3.3 添加节点到集群

添加工作节点

# 在工作节点上执行
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.1.100:2377

# 指定监听地址
docker swarm join \
  --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  --listen-addr 192.168.1.101:2377 \
  --advertise-addr 192.168.1.101:2377 \
  192.168.1.100:2377

添加管理节点

# 在管理节点上执行
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-dj6pjfhuaebgqgglo80ku8ytv 192.168.1.100:2377

# 建议的管理节点数量
# 1 个节点:测试环境
# 3 个节点:小型生产环境
# 5 个节点:中型生产环境
# 7 个节点:大型生产环境(最大推荐)

4. 集群状态验证

4.1 查看集群信息

基本集群信息

# 查看集群基本信息
docker info

# 查看 Swarm 特定信息
docker system info | grep -A 20 "Swarm:"

# 查看集群 ID
docker info --format '{{.Swarm.Cluster.ID}}'

详细集群状态

# 查看所有节点
docker node ls

# 查看节点详细信息
docker node inspect <node-id>

# 查看当前节点信息
docker node inspect self

4.2 节点管理操作

节点状态管理

# 查看节点列表
docker node ls

# 输出示例
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
abcdefghijk *                 manager1   Ready     Active         Leader           20.10.8
lmnopqrstuv                   worker1    Ready     Active                          20.10.8
wxyzabcdefg                   worker2    Ready     Active                          20.10.8

节点可用性控制

# 设置节点为排空状态(不接受新任务)
docker node update --availability drain <node-id>

# 设置节点为暂停状态(暂停接受新任务)
docker node update --availability pause <node-id>

# 设置节点为活跃状态
docker node update --availability active <node-id>

节点标签管理

# 添加节点标签
docker node update --label-add environment=production <node-id>
docker node update --label-add type=compute <node-id>

# 删除节点标签
docker node update --label-rm environment <node-id>

# 查看节点标签
docker node inspect <node-id> --format '{{.Spec.Labels}}'

4.3 网络验证

查看网络列表

# 查看所有网络
docker network ls

# Swarm 默认网络
NETWORK ID     NAME              DRIVER    SCOPE
xxxxxxxxxxxx   bridge            bridge    local
xxxxxxxxxxxx   docker_gwbridge   bridge    local
xxxxxxxxxxxx   host              host      local
xxxxxxxxxxxx   ingress           overlay   swarm
xxxxxxxxxxxx   none              null      local

测试网络连通性

# 创建测试服务
docker service create --name test-connectivity --replicas 2 alpine ping 8.8.8.8

# 查看服务状态
docker service ps test-connectivity

# 查看服务日志
docker service logs test-connectivity

# 清理测试服务
docker service rm test-connectivity

5. 集群配置优化

5.1 管理节点配置

快照配置

# 配置快照保留数量
docker swarm update --snapshot-interval 5000 --log-entries-for-slow-followers 500

# 查看当前配置
docker info --format '{{.Swarm.Cluster.Spec}}'

证书轮换

# 配置证书轮换周期(默认 90 天)
docker swarm update --cert-expiry 168h  # 7 天

# 立即轮换证书
docker swarm ca --rotate

5.2 网络配置优化

自定义网络池

# 重新初始化集群时指定网络池
docker swarm init \
  --default-addr-pool 10.20.0.0/16 \
  --default-addr-pool 10.21.0.0/16 \
  --default-addr-pool-mask-length 24

创建自定义网络

# 创建加密的 overlay 网络
docker network create \
  --driver overlay \
  --opt encrypted \
  --subnet 10.0.1.0/24 \
  my-secure-network

# 创建外部可访问的网络
docker network create \
  --driver overlay \
  --attachable \
  my-attachable-network

5.3 安全配置

启用自动锁定

# 启用自动锁定功能
docker swarm update --autolock=true

# 查看解锁密钥
docker swarm unlock-key

# 解锁集群(重启后需要)
docker swarm unlock

外部 CA 配置

# 使用外部 CA
docker swarm init --external-ca protocol=cfssl,url=https://ca.example.com

# 更新 CA 配置
docker swarm ca --external-ca protocol=cfssl,url=https://ca.example.com

6. 故障排除

6.1 常见问题诊断

节点加入失败

# 检查网络连通性
telnet <manager-ip> 2377

# 检查防火墙设置
sudo iptables -L | grep 2377
sudo firewall-cmd --list-ports

# 检查 Docker 服务状态
sudo systemctl status docker

# 查看 Docker 日志
sudo journalctl -u docker.service -f

集群分裂问题

# 检查管理节点状态
docker node ls

# 查看 Raft 日志
docker system events --filter type=node

# 强制重新选举(谨慎使用)
docker swarm init --force-new-cluster

6.2 日志收集

系统日志

# Docker 服务日志
sudo journalctl -u docker.service --since "1 hour ago"

# 系统内核日志
dmesg | grep -i docker

# 网络相关日志
sudo journalctl -u systemd-networkd --since "1 hour ago"

集群事件

# 实时监控集群事件
docker system events --filter type=node --filter type=service

# 查看特定时间段的事件
docker system events --since "2023-01-01T00:00:00" --until "2023-01-01T23:59:59"

7. 实践练习

练习 1:单机集群搭建

目标:在单台机器上搭建 Swarm 集群

# 1. 初始化集群
docker swarm init

# 2. 查看集群状态
docker node ls
docker info | grep -A 10 "Swarm:"

# 3. 创建测试服务
docker service create --name hello --replicas 3 --publish 8080:80 nginx

# 4. 验证服务
docker service ls
docker service ps hello
curl http://localhost:8080

# 5. 清理
docker service rm hello

练习 2:多节点集群搭建

目标:搭建包含 3 个节点的集群(1 个管理节点,2 个工作节点)

准备:3 台虚拟机或云实例

# 节点 1(管理节点)
docker swarm init --advertise-addr <node1-ip>
docker swarm join-token worker

# 节点 2 和 3(工作节点)
docker swarm join --token <worker-token> <node1-ip>:2377

# 验证集群
docker node ls

练习 3:集群配置优化

目标:配置集群的高级特性

# 1. 启用自动锁定
docker swarm update --autolock=true

# 2. 配置节点标签
docker node update --label-add environment=production node1
docker node update --label-add type=compute node2
docker node update --label-add type=storage node3

# 3. 创建自定义网络
docker network create --driver overlay --opt encrypted secure-net

# 4. 部署带约束的服务
docker service create \
  --name web \
  --constraint 'node.labels.type == compute' \
  --network secure-net \
  --replicas 2 \
  nginx

8. 本章总结

关键要点

  1. 环境准备

    • 确保系统满足硬件和软件要求
    • 正确配置网络和防火墙
    • 安装和配置 Docker 引擎
  2. 集群初始化

    • 使用 docker swarm init 初始化第一个管理节点
    • 通过令牌添加工作节点和管理节点
    • 验证集群状态和网络连通性
  3. 配置优化

    • 配置节点标签和约束
    • 启用安全特性如自动锁定
    • 创建自定义网络和存储
  4. 故障排除

    • 掌握常见问题的诊断方法
    • 学会收集和分析日志
    • 了解集群恢复策略

最佳实践

  1. 规划先行:在部署前仔细规划网络、存储和安全策略
  2. 逐步扩展:从小规模开始,逐步扩展集群规模
  3. 监控为王:建立完善的监控和告警机制
  4. 备份重要:定期备份集群配置和重要数据
  5. 文档记录:详细记录集群配置和操作步骤

下一步学习

在下一章中,我们将学习节点管理与集群维护,包括:

  • 节点角色管理和转换
  • 集群扩容和缩容
  • 节点故障处理
  • 集群备份和恢复

检查清单: - [ ] 系统环境满足要求 - [ ] Docker 引擎正确安装 - [ ] 网络和防火墙配置正确 - [ ] 集群初始化成功 - [ ] 节点加入正常 - [ ] 基本服务部署测试通过