如何在CentOS7上快速搭建Docker Swarm集群?

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

如何在CentOS7上快速搭建Docker Swarm集群?

核心概念解析

在动手实践之前,理解Docker Swarm的几个核心概念至关重要,这有助于我们更好地规划和管理集群。

  • 节点:节点是已加入Docker Swarm集群的Docker引擎实例,节点分为两种角色:

    • 管理节点:负责集群的管理决策,如调度任务、维护集群状态、提供服务发现等,为了实现高可用,生产环境中通常推荐部署奇数个(如3个或5个)管理节点。
    • 工作节点:接收并执行来自管理节点的任务,运行容器实例,工作节点不参与集群管理。
  • 服务:服务是在集群中运行的应用的定义,它指定了使用哪个镜像、运行多少个容器副本、暴露哪些端口以及网络和存储配置等,服务是Swarm中部署的基本单元。

  • 任务:任务是Swarm中最小的调度单位,一个服务通常包含一个或多个任务,每个任务就是一个运行中的容器,管理节点负责将服务中的任务分配到各个工作节点上。

  • 堆栈:堆栈是一组相互关联、协同工作的服务的集合,通常由一个docker-compose.yml文件定义,使用堆栈可以方便地管理和部署复杂的多容器应用。

部署前准备

一个稳定可靠的Swarm集群离不开良好的前期准备,以下是部署前需要完成的关键步骤。

  1. 服务器准备:至少需要两台安装了CentOS 7的虚拟机或物理服务器,为了演示,我们假设有三台服务器:

    • manager1 (IP: 192.168.1.10) – 作为管理节点
    • worker1 (IP: 192.168.1.11) – 作为工作节点
    • worker2 (IP: 192.168.1.12) – 作为工作节点
  2. 安装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
  3. 配置防火墙:CentOS 7默认使用firewalld,必须开放Swarm集群通信所需的端口,否则节点间无法正常通信。

    • 管理节点需要开放以下端口:
      • 2377/tcp:用于集群管理通信。
      • 7946/tcp7946/udp:用于节点间的发现通信。
      • 4789/udp:用于覆盖网络流量。
    • 工作节点需要开放以下端口:
      • 7946/tcp7946/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地址。

如何在CentOS7上快速搭建Docker Swarm集群?

sudo docker swarm init --advertise-addr 192.168.1.10

命令执行成功后,会输出一段包含docker swarm join命令的信息,这是工作节点加入集群所需的凭证,务必妥善保存。

第二步:工作节点加入集群

分别在worker1worker2服务器上,复制并执行上一步中生成的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容器被均匀地分配到了worker1worker2节点上。

服务弹性伸缩

如何在CentOS7上快速搭建Docker Swarm集群?

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:当需要对某个工作节点进行维护(如系统升级)时,如何安全地将其从集群中移除而不影响服务?

解答:为了安全地移除节点,应遵循“先排空,后移除”的原则。

  1. 排空节点:在管理节点上执行docker node update --availability drain <node-id>,此操作会将该节点标记为Drain状态,Swarm会停止在该节点上调度新任务,并将其上现有的任务平滑地迁移到其他可用的工作节点上。
  2. 确认迁移完成:使用docker node ps <node-id>检查该节点上的任务是否已全部结束。
  3. 移除节点:在目标工作节点上执行docker swarm leave,如果该节点是管理节点,则需要添加--force参数。
  4. 清理(可选):在管理节点上执行docker node rm <node-id>,将已离开的节点从集群列表中彻底删除。
    这个过程确保了服务在节点维护期间的连续性和高可用性。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-10-29 07:52
下一篇 2025-10-29 08:07

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信