在容器化技术日益普及的今天,如何有效地管理和编排多个容器实例成为了一个核心议题,Docker Swarm作为Docker官方推出的原生容器编排工具,以其简洁易用、与Docker生态系统无缝集成的特点,成为了许多中小型企业和开发团队的首选方案,将Docker Swarm部署在稳定可靠的CentOS 7操作系统上,可以构建一个既经济又高效的生产级集群环境,本文将深入探讨在CentOS 7上部署、管理和使用Docker Swarm的全过程,涵盖从基础概念到实际操作的各个环节。

核心概念解析
在动手实践之前,理解Docker Swarm的几个核心概念至关重要,这有助于我们更好地规划和管理集群。
节点:节点是已加入Docker Swarm集群的Docker引擎实例,节点分为两种角色:
- 管理节点:负责集群的管理决策,如调度任务、维护集群状态、提供服务发现等,为了实现高可用,生产环境中通常推荐部署奇数个(如3个或5个)管理节点。
- 工作节点:接收并执行来自管理节点的任务,运行容器实例,工作节点不参与集群管理。
服务:服务是在集群中运行的应用的定义,它指定了使用哪个镜像、运行多少个容器副本、暴露哪些端口以及网络和存储配置等,服务是Swarm中部署的基本单元。
任务:任务是Swarm中最小的调度单位,一个服务通常包含一个或多个任务,每个任务就是一个运行中的容器,管理节点负责将服务中的任务分配到各个工作节点上。
堆栈:堆栈是一组相互关联、协同工作的服务的集合,通常由一个
docker-compose.yml文件定义,使用堆栈可以方便地管理和部署复杂的多容器应用。
部署前准备
一个稳定可靠的Swarm集群离不开良好的前期准备,以下是部署前需要完成的关键步骤。
服务器准备:至少需要两台安装了CentOS 7的虚拟机或物理服务器,为了演示,我们假设有三台服务器:
manager1(IP: 192.168.1.10) – 作为管理节点worker1(IP: 192.168.1.11) – 作为工作节点worker2(IP: 192.168.1.12) – 作为工作节点
安装Docker:在所有节点上安装最新稳定版的Docker,CentOS 7的安装过程相对简单。
# 安装必要的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker CE sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置Docker开机自启 sudo systemctl start docker sudo systemctl enable docker
配置防火墙:CentOS 7默认使用
firewalld,必须开放Swarm集群通信所需的端口,否则节点间无法正常通信。- 管理节点需要开放以下端口:
2377/tcp:用于集群管理通信。7946/tcp和7946/udp:用于节点间的发现通信。4789/udp:用于覆盖网络流量。
- 工作节点需要开放以下端口:
7946/tcp和7946/udp:用于节点间的发现通信。4789/udp:用于覆盖网络流量。
在所有节点上执行以下命令来开放端口:
sudo firewall-cmd --add-port=2377/tcp --permanent sudo firewall-cmd --add-port=7946/tcp --permanent sudo firewall-cmd --add-port=7946/udp --permanent sudo firewall-cmd --add-port=4789/udp --permanent sudo firewall-cmd --reload
- 管理节点需要开放以下端口:
集群初始化与节点加入
准备工作就绪后,我们就可以开始构建Swarm集群了。
第一步:初始化管理节点
在manager1服务器上执行docker swarm init命令来初始化集群。--advertise-addr参数指定了其他节点用来连接此管理节点的IP地址。

sudo docker swarm init --advertise-addr 192.168.1.10
命令执行成功后,会输出一段包含docker swarm join命令的信息,这是工作节点加入集群所需的凭证,务必妥善保存。
第二步:工作节点加入集群
分别在worker1和worker2服务器上,复制并执行上一步中生成的docker swarm join命令,命令格式如下:
sudo docker swarm join --token SWMTKN-1-<your-token-string> 192.168.1.10:2377
执行后,你会看到“This node joined a swarm as a worker.”的提示信息。
第三步:验证集群状态
回到管理节点manager1,运行docker node ls命令来查看集群中所有节点的状态。
sudo docker node ls
输出结果应该会列出三个节点,包括它们的ID、主机名、状态、可用性和角色。MANAGER列会显示manager1节点带有Leader标识。
服务部署与管理
集群建立后,真正的价值在于部署和管理应用服务。
部署一个Nginx服务
我们可以通过一条命令在集群中部署一个包含3个副本的Nginx Web服务。
sudo docker service create --name my-web --publish 8080:80 --replicas 3 nginx
--name my-web:为服务命名。--publish 8080:80:将集群中任意节点的8080端口映射到服务容器的80端口,Swarm的 routing mesh 会确保请求被转发到健康的容器实例。--replicas 3:指定运行3个容器副本。
查看服务状态
使用docker service ls查看服务列表,使用docker service ps my-web查看my-web服务的详细任务分布情况,你会发现这3个Nginx容器被均匀地分配到了worker1和worker2节点上。
服务弹性伸缩

Swarm的魅力之一在于其便捷的伸缩能力,如果需要将Nginx服务的副本数增加到5个,只需执行:
sudo docker service scale my-web=5
再次查看任务状态,你会看到Swarm自动启动了2个新的容器任务来满足新的副本数要求。
为了更清晰地展示常用服务管理命令,下表进行了归纳:
| 命令 | 功能描述 |
|---|---|
docker service ls | 列出集群中的所有服务 |
docker service inspect <service-name> | 查看服务的详细配置信息 |
docker service ps <service-name> | 列出服务中各个任务的运行状态及所在节点 |
docker service logs <service-name> | 查看服务的日志输出 |
docker service scale <service-name>=<replicas> | 动态调整服务的副本数量 |
docker service rm <service-name> | 删除一个服务 |
使用Docker Compose部署堆栈
对于复杂应用,手动创建服务效率低下,通过docker-compose.yml文件和docker stack命令,可以实现应用的声明式部署。
创建一个docker-compose.yml示例如下:
version: "3.7"
services:
web:
image: nginx:alpine
ports:
- "8081:80"
deploy:
replicas: 2
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8082:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager] 此文件定义了两个服务:web(Nginx)和visualizer(一个Swarm集群可视化工具)。deploy部分是Swarm特有的配置,用于定义副本数、更新策略和部署位置约束。
在管理节点上,使用以下命令部署堆栈:
sudo docker stack deploy -c docker-compose.yml my-app
使用docker stack services my-app可以查看堆栈中所有服务的状态,通过访问任意节点的8082端口,你可以在浏览器中直观地看到集群的节点分布和服务运行情况。
相关问答FAQs
问题1:如何将一个工作节点提升为管理节点以增强集群的高可用性?
解答:在Docker Swarm中,可以动态地将工作节点提升为管理节点,在管理节点上使用docker node ls找到目标工作节点的ID或名称,执行以下命令:sudo docker node promote <worker-node-id-or-name>
要将worker1提升为管理节点,命令为:sudo docker node promote worker1,执行后,该节点会同步集群状态并参与管理决策,同样,使用docker node demote <manager-node-id>可以将管理节点降级为工作节点。
问题2:当需要对某个工作节点进行维护(如系统升级)时,如何安全地将其从集群中移除而不影响服务?
解答:为了安全地移除节点,应遵循“先排空,后移除”的原则。
- 排空节点:在管理节点上执行
docker node update --availability drain <node-id>,此操作会将该节点标记为Drain状态,Swarm会停止在该节点上调度新任务,并将其上现有的任务平滑地迁移到其他可用的工作节点上。 - 确认迁移完成:使用
docker node ps <node-id>检查该节点上的任务是否已全部结束。 - 移除节点:在目标工作节点上执行
docker swarm leave,如果该节点是管理节点,则需要添加--force参数。 - 清理(可选):在管理节点上执行
docker node rm <node-id>,将已离开的节点从集群列表中彻底删除。
这个过程确保了服务在节点维护期间的连续性和高可用性。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复