1. Docker Swarm核心概念解析Docker Swarm是Docker官方推出的容器编排工具它能够将多台Docker主机组成一个集群像操作单台主机一样管理整个集群。想象一下你有一个乐高玩具工厂Swarm就是那个能把所有分散的乐高生产线整合成统一装配线的智能控制系统。Swarm集群的三大核心组件管理节点Manager相当于集群的大脑负责决策和调度。生产环境建议配置奇数个管理节点3/5/7个通过Raft协议保证高可用。我曾经在一个电商项目中配置了3个管理节点当其中一个节点宕机时服务完全不受影响。工作节点Worker干活的工人只负责执行容器任务。在实际部署时我习惯给Worker节点打上envprod或diskssd这类标签方便后期服务调度。服务Service这是Swarm的核心抽象概念。比如你定义一个Nginx服务指定3个副本Swarm会自动在集群中维持3个Nginx容器的运行状态。2. 从零搭建高可用Swarm集群2.1 环境准备假设我们有三台CentOS 7主机管理节点192.168.1.104核8G工作节点1192.168.1.114核8G工作节点2192.168.1.124核8G基础配置所有节点执行# 设置主机名 hostnamectl set-hostname swarm-manager # 在管理节点执行 hostnamectl set-hostname worker-1 # 在工作节点1执行 hostnamectl set-hostname worker-2 # 在工作节点2执行 # 更新hosts文件 cat /etc/hosts EOF 192.168.1.10 swarm-manager 192.168.1.11 worker-1 192.168.1.12 worker-2 EOF # 关闭防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 安装Docker CE yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker2.2 初始化Swarm集群在管理节点执行docker swarm init --advertise-addr 192.168.1.10成功后会输出类似这样的加入命令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.1.10:2377在工作节点执行上述join命令docker swarm join --token your-token 192.168.1.10:2377验证集群状态# 在管理节点执行 docker node ls # 输出示例 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz * swarm-manager Ready Active Leader 20.10.7 k8z0g5we9q5vj7qk6f0d4m5v6 worker-1 Ready Active 20.10.7 m9rowe3wuy6z4tq0x4y98k1n1 worker-2 Ready Active 20.10.73. 服务编排实战部署WebRedis应用栈3.1 创建Overlay网络Overlay网络是实现跨主机容器通信的关键docker network create -d overlay --subnet10.0.9.0/24 mynet3.2 部署Redis服务docker service create \ --name redis \ --network mynet \ --replicas 3 \ --publish published6379,target6379 \ redis:6.2-alpine参数解析--replicas 3创建3个副本实现高可用--publish将容器端口映射到主机端口Swarm的路由网格Routing Mesh会让所有节点都能访问该服务3.3 部署Nginx服务docker service create \ --name web \ --network mynet \ --replicas 5 \ --publish published80,target80 \ nginx:1.213.4 验证服务部署# 查看服务列表 docker service ls # 查看具体服务详情 docker service ps redis docker service ps web # 测试访问从任意节点 curl http://worker-1 curl http://swarm-manager:63794. 高级运维技巧4.1 服务伸缩与滚动更新动态扩缩容# 将web服务扩展到10个副本 docker service scale web10 # 使用update命令等效操作 docker service update --replicas 10 web滚动更新Nginx版本docker service update \ --image nginx:1.23 \ --update-parallelism 2 \ --update-delay 10s \ web这表示每次更新2个副本间隔10秒。我在生产环境更新时通常会先用--update-order start-first参数启动新容器后再停止旧容器实现无缝切换。4.2 故障自愈演示手动停止一个运行Redis容器的Worker节点# 在worker-1上执行 systemctl stop docker观察Swarm的自愈过程watch docker service ps redis你会看到Swarm自动在其他节点重新启动Redis容器始终保持3个副本的运行状态。4.3 约束服务部署位置给节点打标签docker node update --label-add diskssd worker-1 docker node update --label-add diskhdd worker-2部署需要SSD的服务docker service create \ --name db \ --constraint node.labels.diskssd \ --replicas 2 \ postgres:135. 生产环境最佳实践安全加固建议加密Swarm通信docker swarm init --autolocktrue定期轮换join tokendocker swarm join-token --rotate worker性能优化技巧为关键服务配置资源限制docker service update \ --limit-cpu 2 \ --limit-memory 1GB \ web使用全局服务Global Service部署监控代理docker service create \ --mode global \ --name node-exporter \ prom/node-exporter监控方案 部署Portainer可视化管理docker service create \ --name portainer \ --publish 9000:9000 \ --constraint node.role manager \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ portainer/portainer在真实项目中我曾用这套方案为一家互联网金融公司搭建了支撑双十一活动的容器平台平稳应对了每秒5000的订单峰值。关键是要提前做好容量规划并通过docker service inspect --pretty 服务名定期检查服务状态。
【云原生】实战演练:从零构建高可用Docker Swarm集群与核心服务编排
1. Docker Swarm核心概念解析Docker Swarm是Docker官方推出的容器编排工具它能够将多台Docker主机组成一个集群像操作单台主机一样管理整个集群。想象一下你有一个乐高玩具工厂Swarm就是那个能把所有分散的乐高生产线整合成统一装配线的智能控制系统。Swarm集群的三大核心组件管理节点Manager相当于集群的大脑负责决策和调度。生产环境建议配置奇数个管理节点3/5/7个通过Raft协议保证高可用。我曾经在一个电商项目中配置了3个管理节点当其中一个节点宕机时服务完全不受影响。工作节点Worker干活的工人只负责执行容器任务。在实际部署时我习惯给Worker节点打上envprod或diskssd这类标签方便后期服务调度。服务Service这是Swarm的核心抽象概念。比如你定义一个Nginx服务指定3个副本Swarm会自动在集群中维持3个Nginx容器的运行状态。2. 从零搭建高可用Swarm集群2.1 环境准备假设我们有三台CentOS 7主机管理节点192.168.1.104核8G工作节点1192.168.1.114核8G工作节点2192.168.1.124核8G基础配置所有节点执行# 设置主机名 hostnamectl set-hostname swarm-manager # 在管理节点执行 hostnamectl set-hostname worker-1 # 在工作节点1执行 hostnamectl set-hostname worker-2 # 在工作节点2执行 # 更新hosts文件 cat /etc/hosts EOF 192.168.1.10 swarm-manager 192.168.1.11 worker-1 192.168.1.12 worker-2 EOF # 关闭防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 安装Docker CE yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker2.2 初始化Swarm集群在管理节点执行docker swarm init --advertise-addr 192.168.1.10成功后会输出类似这样的加入命令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.1.10:2377在工作节点执行上述join命令docker swarm join --token your-token 192.168.1.10:2377验证集群状态# 在管理节点执行 docker node ls # 输出示例 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz * swarm-manager Ready Active Leader 20.10.7 k8z0g5we9q5vj7qk6f0d4m5v6 worker-1 Ready Active 20.10.7 m9rowe3wuy6z4tq0x4y98k1n1 worker-2 Ready Active 20.10.73. 服务编排实战部署WebRedis应用栈3.1 创建Overlay网络Overlay网络是实现跨主机容器通信的关键docker network create -d overlay --subnet10.0.9.0/24 mynet3.2 部署Redis服务docker service create \ --name redis \ --network mynet \ --replicas 3 \ --publish published6379,target6379 \ redis:6.2-alpine参数解析--replicas 3创建3个副本实现高可用--publish将容器端口映射到主机端口Swarm的路由网格Routing Mesh会让所有节点都能访问该服务3.3 部署Nginx服务docker service create \ --name web \ --network mynet \ --replicas 5 \ --publish published80,target80 \ nginx:1.213.4 验证服务部署# 查看服务列表 docker service ls # 查看具体服务详情 docker service ps redis docker service ps web # 测试访问从任意节点 curl http://worker-1 curl http://swarm-manager:63794. 高级运维技巧4.1 服务伸缩与滚动更新动态扩缩容# 将web服务扩展到10个副本 docker service scale web10 # 使用update命令等效操作 docker service update --replicas 10 web滚动更新Nginx版本docker service update \ --image nginx:1.23 \ --update-parallelism 2 \ --update-delay 10s \ web这表示每次更新2个副本间隔10秒。我在生产环境更新时通常会先用--update-order start-first参数启动新容器后再停止旧容器实现无缝切换。4.2 故障自愈演示手动停止一个运行Redis容器的Worker节点# 在worker-1上执行 systemctl stop docker观察Swarm的自愈过程watch docker service ps redis你会看到Swarm自动在其他节点重新启动Redis容器始终保持3个副本的运行状态。4.3 约束服务部署位置给节点打标签docker node update --label-add diskssd worker-1 docker node update --label-add diskhdd worker-2部署需要SSD的服务docker service create \ --name db \ --constraint node.labels.diskssd \ --replicas 2 \ postgres:135. 生产环境最佳实践安全加固建议加密Swarm通信docker swarm init --autolocktrue定期轮换join tokendocker swarm join-token --rotate worker性能优化技巧为关键服务配置资源限制docker service update \ --limit-cpu 2 \ --limit-memory 1GB \ web使用全局服务Global Service部署监控代理docker service create \ --mode global \ --name node-exporter \ prom/node-exporter监控方案 部署Portainer可视化管理docker service create \ --name portainer \ --publish 9000:9000 \ --constraint node.role manager \ --mount typebind,src/var/run/docker.sock,dst/var/run/docker.sock \ portainer/portainer在真实项目中我曾用这套方案为一家互联网金融公司搭建了支撑双十一活动的容器平台平稳应对了每秒5000的订单峰值。关键是要提前做好容量规划并通过docker service inspect --pretty 服务名定期检查服务状态。