学习目标
通过本章学习,您将能够:
- 了解 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. 本章总结
关键要点
环境准备
- 确保系统满足硬件和软件要求
- 正确配置网络和防火墙
- 安装和配置 Docker 引擎
集群初始化
- 使用
docker swarm init
初始化第一个管理节点 - 通过令牌添加工作节点和管理节点
- 验证集群状态和网络连通性
- 使用
配置优化
- 配置节点标签和约束
- 启用安全特性如自动锁定
- 创建自定义网络和存储
故障排除
- 掌握常见问题的诊断方法
- 学会收集和分析日志
- 了解集群恢复策略
最佳实践
- 规划先行:在部署前仔细规划网络、存储和安全策略
- 逐步扩展:从小规模开始,逐步扩展集群规模
- 监控为王:建立完善的监控和告警机制
- 备份重要:定期备份集群配置和重要数据
- 文档记录:详细记录集群配置和操作步骤
下一步学习
在下一章中,我们将学习节点管理与集群维护,包括:
- 节点角色管理和转换
- 集群扩容和缩容
- 节点故障处理
- 集群备份和恢复
检查清单: - [ ] 系统环境满足要求 - [ ] Docker 引擎正确安装 - [ ] 网络和防火墙配置正确 - [ ] 集群初始化成功 - [ ] 节点加入正常 - [ ] 基本服务部署测试通过