本文档风哥主要介绍Linux系统大规模Docker Swarm集群部署与应用编排,包括Docker Swarm基础概念、Swarm集群架构、应用编排原理、Swarm集群搭建、服务部署与管理、存储卷管理以及实战案例等内容,风哥教程参考Docker官方文档、Linux官方文档Containers and virtual machines等内容,适合系统管理员在生产环境中使用。
Part01-基础概念与理论知识
1.1 Docker Swarm基础概念
Docker Swarm是Docker官方提供的容器编排工具,用于管理多个Docker主机组成的集群。Docker Swarm提供了服务发现、负载均衡、高可用性等功能,使容器应用可以在集群中高效运行。
- 节点(Node):Docker主机,可以是管理节点(Manager)或工作节点(Worker)
- 服务(Service):定义了容器的运行方式,包括镜像、端口、副本数等
- 任务(Task):服务的一个实例,是Swarm调度的最小单位
- 集群(Cluster):由多个节点组成的Docker Swarm集群
- 负载均衡(Load Balancing):自动在节点间分发请求
- 服务发现(Service Discovery):自动发现集群中的服务
1.2 Swarm集群架构
Docker Swarm集群由管理节点和工作节点组成:
– 管理节点(Manager):负责集群管理、服务调度和集群状态维护
– 工作节点(Worker):负责运行容器任务
– Raft共识机制:管理节点之间通过Raft协议保持状态一致
– 服务网格:通过Overlay网络实现容器间通信
# 节点角色
– 管理节点:可以执行管理命令,也可以运行任务
– 工作节点:只能运行任务,不能执行管理命令
– 领导节点:管理节点中的领导者,负责集群决策
1.3 应用编排原理
Docker Swarm的应用编排原理:
- 服务定义:通过docker service create命令定义服务
- 调度算法:根据节点资源和约束条件调度任务
- 服务发现:通过DNS实现服务间的发现和通信
- 负载均衡:内置负载均衡,分发请求到多个任务
- 滚动更新:支持服务的滚动更新,保证服务可用性
- 健康检查:监控服务健康状态,自动重启失败的任务
Part02-生产环境规划与建议
2.1 集群架构设计
生产环境Docker Swarm集群架构设计要点:
– 管理节点:3-5个,确保高可用性
– 工作节点:根据应用需求确定,支持水平扩展
– 节点分布:跨可用区部署,提高可靠性
# 网络架构
– Overlay网络:用于容器间通信
– ingress网络:用于服务暴露
– 自定义网络:用于服务间隔离
# 存储架构
– 本地存储:适合无状态应用
– 共享存储:适合有状态应用,如NFS、GlusterFS
– 存储插件:使用Docker卷插件,如RexRay、Portworx
2.2 硬件要求
生产环境硬件要求:
– CPU:多核处理器,推荐4核以上
– 内存:8GB以上,根据容器数量调整
– 存储:SSD存储,提高I/O性能
– 网络:万兆网卡,确保网络带宽
# 管理节点要求
– 更高的CPU和内存配置:处理集群管理任务
– 冗余电源和网络:提高可靠性
– 跨可用区部署:确保高可用性
# 工作节点要求
– 根据应用需求配置:不同应用对资源要求不同
– 可扩展性:支持水平扩展
– 监控:实时监控节点状态
2.3 网络设计
生产环境网络设计要点:
– 管理网络:用于集群管理通信
– 业务网络:用于容器间通信
– 外部网络:用于服务暴露
# 网络配置
– 静态IP:所有节点使用静态IP
– 网络隔离:使用VLAN隔离不同网络
– 网络冗余:多网卡绑定
– 网络监控:监控网络状态
# 网络安全
– 防火墙:限制网络访问
– 加密通信:使用TLS加密集群通信
– 访问控制:限制管理网络访问
Part03-生产环境项目实施方案
3.1 Swarm集群搭建
3.1.1 安装Docker
$ sudo dnf install -y dnf-plugins-core
$ sudo dnf config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务
$ sudo systemctl start docker
$ sudo systemctl enable docker
# 查看Docker状态
$ sudo systemctl status docker
● docker.service – Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2026-04-03 08:00:00 CST; 1min ago
Docs: https://docs.docker.com
Main PID: 1234 (dockerd)
Tasks: 10
Memory: 100.1M
CPU: 1.244s
CGroup: /system.slice/docker.service
└─1234 /usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
# 验证Docker安装
$ docker –version
Docker version 24.0.7, build afdd53b
3.更多视频教程www.fgedu.net.cn1.2 初始化Swarm集群
$ docker swarm init –advertise-addr 192.168.1.101
Swarm initialized: current node (1234567890ab) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join –token SWMTKN-1-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 192.168.1.101:2377
To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.
# 查看Swarm状态
$ docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.11.2)
compose: Docker Compose (Docker Inc., v2.21.0)
scan: Docker Scan (Docker Inc., v0.23.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 24.0.7
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: 1234567890ab
Is Manager: true
ClusterID: 0123456789abcdef0123456789abcdef
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.1.101
Manager Addresses:
192.168.1.101:2377
Runtimes:
io.containerd.runc.v2
io.containerd.runtime.v1.linux
runc
Default Runtime: runc
Init Binary:
containerd version: 1e1ea6e986c6c86565bc33d52e34b81b3e2bc71f
runc version: v1.1.10-0-g18a0cb0
init version: de40ad0
Security Options:
seccomp
Profile: builtin
selinux
Kernel Version: 5.14.0-362.8.1.el9_3.x86_64
Operating System: CentOS Linux 9 Stream
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.5GiB
Name: manager1
ID: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
3.1.3 添加节点到Swarm集群
$ docker swarm join –token SWMTKN-1-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 192.168.1.101:2377
This node joined a swarm as a worker.
# 添加更多管理节点
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join –token SWMTKN-1-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 192.168.1.101:2377
# 查看集群节点
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
1234567890ab * manager1 Ready Active Leader 24.0.7
234567890abc worker1 Ready Active 24.0.7
34567890abcd worker2 Ready Active 24.0.7
4567890abcde manager2 Ready Active Reachable 24.0.7
3.2 服务部署与管理
3.2.1 部署服务
$ docker service create –name nginx –replicas 3 –publish 80:80 nginx
# 查看服务状态
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abcdef123456 nginx replicated 3/3 nginx:latest *:80->80/tcp
# 查看服务任务
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
1234567890ab nginx.1 nginx:latest worker1 Running Running 5 minutes ago
234567890abc nginx.2 nginx:latest worker2 Running Running 5 minutes ago
34567890abcd nginx.3 nginx:latest manager1 Running Running 5 minutes ago
# 扩展服务
$ docker service scale nginx=5
nginx scaled to 5
# 查看服务状态
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abcdef123456 nginx replicated 5/5 nginx:latest *:80->80/tcp
3.2.2 服务更新
$ docker service update –image nginx:1.25 nginx
# 查看服务更新状态
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
4567890abcde nginx.1 nginx:1.25 worker1 Running Running 1 minute ago
567890abcdef nginx.2 nginx:1.25 worker2 Running Running 1 minute ago
67890abcdef0 nginx.3 nginx:1.25 manager1 Running Running 1 minute ago
7890abcdef01 nginx.4 nginx:1.25 worker1 Running Running 1 minute ago
890abcdef012 nginx.5 nginx:1.25 worker2 Running Running 1 minute ago
1234567890ab nginx.1 nginx:latest worker1 Shutdown Shutdown 2 minutes ago
234567890abc nginx.2 nginx:latest worker2 Shutdown Shutdown 2 minutes ago
34567890abcd nginx.3 nginx:latest manager1 Shutdown Shutdown 2 minutes ago
3.3 存储卷管理
3.3.1 创建存储卷
$ docker volume create my-volume
# 查看存储卷
$ docker volume ls
DRIVER VOLUME NAME
local my-volume
# 部署使用存储卷的服务
$ docker service create –name web –replicas 3 –mount source=my-volume,target=/app nginx
# 查看服务状态
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abcdef123456 web replicated 3/3 nginx:latest
Part04-生产案例与实战讲解
4.1 Web服务集群案例
4.1.1 企业级Web服务集群
# 环境:3节点Swarm集群
# 目标:部署高可用Web服务
# 1. 部署Nginx服务
$ docker service create –name web –replicas 5 –publish 80:80 –mount source=web-data,target=/usr/share/nginx/html nginx
# 2. 部署Redis服务
$ docker service create –name redis –replicas 1 –publish 6379:6379 redis
# 3. 部署MySQL服务
$ docker service create –name mysql –replicas 1 –publish 3306:3306 –mount source=mysql-data,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=fgedu123 -e MYSQL_DATABASE=fgedudb mysql
# 4. 查看服务状态
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abcdef123456 web replicated 5/5 nginx:latest *:80->80/tcp
bcdef1234567 redis replicated 1/1 redis:latest *:6379->6379/tcp
cdef12345678 mysql replicated 1/1 mysql:latest *:3306->3306/tcp
# 5. 测试Web服务
$ curl http://192.168.1.101
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
4.2 数据库集群案例
4.2.1 MySQL主从复制集群
# 环境:3节点Swarm集群
# 目标:部署MySQL主从复制集群
# 1. 创建网络
$ docker network create –driver overlay mysql-network
# 2. 部署MySQL主服务器
$ docker service create –name mysql-master –replicas 1 –network mysql-network –mount source=mysql-master-data,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=fgedu123 -e MYSQL_DATABASE=fgedudb mysql
# 3. 部署MySQL从服务器
$ docker service create –name mysql-slave –replicas 2 –network mysql-network –mount source=mysql-slave-data,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=fgedu123 -e MYSQL_DATABASE=fgedudb -e MYSQL_MASTER_HOST=mysql-master -e MYSQL_MASTER_USER=repl -e MYSQL_MASTER_PASSWORD=repl123 mysql
# 4. 配置主从复制
$ docker exec -it $(docker ps -q -f name=mysql-master) mysql -u root -p
Enter password:
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl123’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————+———-+————–+——————+——————-+
| binlog.000001 | 156 | | | |
+—————+———-+————–+——————+——————-+
# 5. 配置从服务器
$ docker exec -it $(docker ps -q -f name=mysql-slave) mysql -u root -p
Enter password:
mysql> CHANGE MASTER TO
-> MASTER_HOST=’mysql-master’,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’repl123′,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=156;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
4.3 微服务架构案例
4.3.1 微服务应用部署
# 环境:5节点Swarm集群
# 目标:部署微服务应用
# 1. 创建网络
$ docker network create –driver overlay microservices-network
# 2. 部署API网关
$ docker service create –name api-gateway –replicas 3 –network microservices-network –publish 8080:8080 nginx
# 3. 部署用户服务
$ docker service create –name user-service –replicas 2 –network microservices-network user-service:latest
# 4. 部署订单服务
$ docker service create –name order-service –replicas 2 –network microservices-network orde学习交流加群风哥QQ113257174r-service:latest
# 5. 部署产品服务
$ docker service create –name product-service –replicas 2 –network microservices-network produc学习交流加群风哥微信: itpux-comt-service:latest
# 6. 部署数据库服务
$ docker service create –name mongodb –replicas 1 –network microservices-network –mount source=mongodb-data,target=/data/db mongo
# 7. 查看服务状态
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
abcdef123456 api-gateway replicated 3/3 nginx:latest *:8080->8080/tcp
bcdef1234567 user-service replicated 2/2 user-service:latest
cdef12345678 order-service replicated 2/2 order-service:latest
def123456789 product-service replicated 2/2 product-service:latest
ef1234567890 mongodb replicated 1/1 mongo:latest
Part05-风哥经验总结与分享
5.1 Docker Swarm最佳实践
Docker Swarm最佳实践:
- 使用奇数个管理节点:3-5个管理节点,确保高可用性
- 合理规划服务副本数:根据应用需求和节点资源调整副本数
- 使用健康检查:配置服务健康检查,自动重启失败的任务
- 使用滚动更新:确保服务更新过程中的可用性
- 使用网络隔离:为不同服务创建专用网络
- 使用存储卷:为有状态应用配置持久存储
- 监控与日志:实时监控集群状态,收集服务日志
- 定期备份:备份重要数据和配置
5.2 常见问题与解决方案
## 1. 集群节点不可用
– 原因:网络问题、节点资源不足、Docker服务故障
– 解决方案:检查网络连接、增加节点资源、重启Docker服务
## 2. 服务部署失败
– 原因:镜像拉取失败、资源不足、配置错误
– 解决方案:检查网络连接、增加节点资源、修正配置
## 3. 存储卷问题
– 原因:存储卷权限错误、存储空间不足、存储插件故障
– 解决方案:检查权限配置、增加存储空间、重启存储插件
## 4. 网络问题
– 原因:网络配置错误、防火墙阻止、Overlay网络故障
– 解决方案:检查网络配置、关闭防火墙或开放端口、重建Overlay网络
## 5. 性能问题
– 原因:节点资源不足、服务副本数过多、网络带宽不足
– 解决方案:增加节点资源、调整服务副本数、增加网络带宽
5.3 性能调优建议
风哥针对
from PG视频:www.itpux.com
Docker Swarm性能调优建议:
- 优化节点资源:根据应用需求配置节点CPU、内存和存储
- 调整服务副本数:根据负载情况调整副本数
- 优化网络:使用万兆网络,配置适当的MTU
- 优化存储:使用SSD存储,配置适当的存储卷
- 使用资源限制:为服务设置CPU和内存限制
- 使用健康检查:配置合理的健康检查间隔
- 监控与告警:实时监控集群性能,及时发现问题
- 定期维护:清理无用容器和镜像,优化节点资源
风哥提示:
风哥提示:
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
