Docker Swarm 深度解析:从零构建企业级容器集群

0 阅读10分钟

Docker Swarm 概述

什么是 Swarm?

Docker Swarm 是 Docker 官方的原生容器编排工具。它能将多台物理机整合成一个“超级计算机”,让你像管理一台机器一样管理整个集群。

核心架构

  • Manager(管理节点):负责发号施令(调度、维护集群状态)。
  • Worker(工作节点):负责干活(运行容器)。

为什么要学?

  1. 省事:Docker 自带,无需额外安装复杂组件。
  2. 高可用:机器挂了,服务自动漂移到其他节点。
  3. 易伸缩:一条命令 scale,秒级扩容。

Swarm vs K8s

Swarm 是轻量级战斗机(简单快),K8s 是航空母舰(复杂强)。 中小团队、快速部署首选 Swarm。

一、实验环境准备

在开始搭建 Docker Swarm 集群之前,请确保您已满足以下前置条件。

1.1 系统与网络要求

  1. 操作系统:实验主机需安装 CentOS 7.6 版本。
  2. 网络连通性:主机必须能够连接外网(用于下载 Docker 镜像和依赖包)。
  3. 安全设置:建议关闭防火墙(Firewall)和 SELinux,以避免集群通信出现权限问题。
  4. 硬件建议:推荐使用云主机进行实验,并通过 SSH 远程连接操作,模拟真实生产环境。

1.2 集群节点规划

本实验共使用 3 台虚拟机/云主机,网络互通,规划如下表所示:

主机名 (Hostname)IP 地址角色 (Role)说明
master192.168.5.100/24管理节点 (Manager)负责集群初始化与任务调度
node1192.168.5.101/24工作节点 (Worker)负责运行容器服务
node2192.168.5.102/24工作节点 (Worker)负责运行容器服务

1.3 Docker 环境安装

如果您的系统中尚未安装 Docker,请按照以下步骤进行安装(所有节点均需执行):

1. 安装必要依赖包 打开终端,执行以下命令安装 yum-utilsdevice-mapper-persistent-datalvm2

yum install -y yum-utils device-mapper-persistent-data lvm2

2. 配置阿里云 Docker 软件源 使用 yum-config-manager 添加 Docker 的阿里云仓库:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 更新 YUM 缓存

yum makecache fast

4. 安装 Docker CE (社区版)

yum install -y docker-ce

5. 启动并设置开机自启 安装完成后,启动 Docker 服务并配置为开机自动运行:

systemctl restart docker
systemctl enable docker

二、集群节点初始环境设置

在正式初始化 Swarm 集群之前,我们需要确保所有节点的主机名规范统一,并验证 Docker 环境的可用性。

2.1 修改主机名 (Hostname)

为了方便集群管理和节点识别,我们需要修改每台机器的主机名。请在对应的机器上执行以下命令:

1. 在 Master 节点执行:

# 将主机名设置为 master
[root@localhost ~]# hostnamectl set-hostname master

2. 在 Node1 节点执行:

# 将主机名设置为 node1
[root@localhost ~]# hostnamectl set-hostname node1

3. 在 Node2 节点执行:

# 将主机名设置为 node2
[root@localhost ~]# hostnamectl set-hostname node2

💡 提示:执行完上述命令后,新的主机名通常需要重新登录终端或重启系统才能完全生效。

2.2 验证 Docker 版本信息

环境准备完毕后,我们需要确保每台节点上的 Docker 都已经正确安装且版本一致。请在 master、node1、node2 三台机器上分别执行以下命令进行检查:

1. 在 Master 节点查看:

[root@master ~]# docker version
# 预期输出信息:
Client:
 Version:       18.03.0-ce
 API version:   1.37
 Go version:    go1.9.4
 Git commit:    0520e24
 Built: Wed Mar 21 23:09:15 2018
 OS/Arch:       linux/amd64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:      18.03.0-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.4
  Git commit:   0520e24
  Built:        Wed Mar 21 23:13:03 2018
  OS/Arch:      linux/amd64
  Experimental: false

2. 在 Node1 和 Node2 节点查看: 在另外两个节点执行相同的查看命令,正常情况下,它们显示的 Version 信息应与 Master 节点完全一致。

[root@node1 ~]# docker version
[root@node2 ~]# docker version

验证标准:只有当三台机器的 Docker 版本均显示为 18.03.0-ce 且服务处于运行状态时,方可进行下一步的集群初始化操作。

三、创建 Swarm 集群管理节点 (Manager)

Swarm 集群的创建始于管理节点(Manager)的初始化。Manager 节点负责后续的调度、服务发现和集群状态维护。

3.1 获取 Swarm 镜像

虽然 Docker 1.12+ 版本已经内置了 Swarm 模式,但为了实验完整性,我们在所有节点上手动拉取 swarm 镜像。

请在 master、node1、node2 三台主机上分别执行以下命令:

[root@master ~]# docker pull swarm
[root@node1 ~]# docker pull swarm
[root@node2 ~]# docker pull swarm

3.2 初始化集群

master 节点上执行初始化命令。这里使用 --advertise-addr 参数指定管理节点的对外通信 IP(即 192.168.5.100)。

# 在 master 节点上初始化集群,并获取唯一的 token,作为集群的唯一标识。
[root@master ~]# docker swarm init --advertise-addr 192.168.5.100
Swarm initialized: current node (62n5811em9hk0gynu4r9f2uuz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-53103t4mocf35g98efaupv2y77chfyd2f8upxti9jcwk6d5g35-19j3s7bqti0gnvm1ebdz9fzho 192.168.5.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@master ~]#
# 说明:将提示中的 token 值复制,如下所示。后期利用获取的 token 值将其他节点加入集群。
docker swarm join --token SWMTKN-1-53103t4mocf35g98efaupv2y77chfyd2f8upxti9jcwk6d5g35-19j3s7bqti0gnvm1ebdz9fzho 192.168.5.100:2377

四、加入集群工作节点 (Worker)

Master 节点初始化完成后,工作节点(Worker)就可以使用刚才获取的 Token “入场券” 加入集群了。

4.1 在 Node1 节点执行加入命令

请登录到 node1 服务器,执行以下命令:

[root@node1 ~]# docker swarm join --token SWMTKN-1-53103t4mocf35g98efaupv2y77chfyd2f8upxti9jcwk6d5g35-19j3s7bqti0gnvm1ebdz9fzho 192.168.5.100:2377

✅ 成功提示: 如果看到 This node joined a swarm as a worker.,说明 node1 已成功加入。

4.2 在 Node2 节点执行加入命令

同样地,登录到 node2 服务器,执行完全相同的命令:

[root@node2 ~]# docker swarm join --token SWMTKN-1-53103t4mocf35g98efaupv2y77chfyd2f8upxti9jcwk6d5g35-19j3s7bqti0gnvm1ebdz9fzho 192.168.5.100:2377

✅ 成功提示: 同样应显示 This node joined a swarm as a worker.

4.3 在 Master 节点验证集群状态

现在,所有的节点都已经就位。回到 master 节点,使用 docker node ls 命令查看集群的完整拓扑结构。

执行命令:

[root@master ~]# docker node ls

预期输出结果: 输出结果

📊 结果解读:

  • HOSTNAME:列出了 master, node1, node2。
  • STATUS:均为 Ready,表示节点运行正常。
  • MANAGER STATUS:只有 master 节点显示 Leader,其他节点不显示此项(因为它们是 Worker)。
  • ENGINE VERSION:所有节点的引擎版本保持一致。

至此,一个包含 1 个管理节点和 2 个工作节点的 Docker Swarm 集群已搭建完成!

五、查看集群全局信息

在集群搭建完毕后,除了查看节点列表,我们还需要确认集群的整体运行状态。docker info 命令可以展示 Docker 引擎以及 Swarm 模式的详细配置。

5.1 执行查看命令

进入 master (管理节点),执行以下命令:

[root@master ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 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: 62n5811em9hk0gynu4r9f2uuz
  Is Manager: true
  ClusterID: ir9ii97clpxzpsq9dq3e9fu7r
  Managers: 1
  Nodes: 3
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
   # 从提示信息中可以看到,swarm 集群已经运行,有三个节点,其中有 1 个管理节点。

六、在 Swarm 中部署与验证服务

集群搭建完成后,我们将部署第一个服务(Service)来验证集群的计算能力和调度功能。

6.1 创建 Helloworld 服务

我们将创建一个基于 alpine 镜像的服务,让它在后台持续 Ping 新浪网(www.sina.com.cn),以此模拟业务的持续运行。

步骤 1:拉取镜像master 节点上拉取轻量级的 alpine 镜像:

[root@master ~]# docker pull alpine   // 拉取 alpine:latest 镜像
[root@master ~]# docker service create --replicas 1 --name helloworld alpine ping www.sina.com.cn
ywkctxbswsnxnvimtimm8ra8t
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

看到 Service converged 即表示服务创建并启动成功。

6.2 查看服务运行状态

使用 docker service ps 查看该服务具体运行在哪个节点上。

[root@master ~]# docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
tfs7wx93jioq        helloworld.1        alpine:latest       master              Running             Running about a minute ago   
# 从提示信息上表示,helloworld 服务运行在 master 节点上。

6.3 查看服务详细信息

使用 --pretty 参数可以人性化地查看服务的详细配置(如更新策略、回滚策略等)。

[root@master ~]# docker service inspect --pretty helloworld

ID:             ywkctxbswsnxnvimtimm8ra8t
Name:           helloworld
Service Mode:   Replicated
 Replicas:      1
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         alpine:latest@sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
 Args:          ping www.sina.com.cn 
 Init:          false
Resources:
Endpoint Mode:  vip

6.4 扩展集群服务

[root@master ~]# docker service scale helloworld=2
helloworld scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@master ~]# docker service ps helloworld  # 查看服务运行状态
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
mznxcdkh8alr        helloworld.1        alpine:latest       master              Running             Running 4 minutes ago                        
fu98gxp0pzvx        helloworld.2        alpine:latest       node1               Running             Running 42 seconds ago                       
# 说明:从提示上可以看到服务运行在 master 和 node1 节点。

6.5 删除服务

[root@master ~]# docker service rm helloworld   // 删除服务
helloworld

[root@master ~]# docker service ps helloworld  // 查看服务运行状态
no such service: helloworld
# 说明:从提示上可以看到服务已经删除。

七、实验总结

通过本次 Docker Swarm 实验,我成功搭建了一个包含 1 个 Manager 节点和 2 个 Worker 节点的容器集群,并完成了服务的部署与弹性伸缩。具体总结如下:

  1. 集群构建能力:掌握了 Swarm 集群的初始化流程,理解了 docker swarm init 生成 Token 的机制,以及 Worker 节点如何通过 Token 加入集群。
  2. 服务编排理解:深刻理解了 Swarm 中“Service(服务)”与单机“Container(容器)”的区别。学会了使用 docker service createdocker service scale 命令来管理应用的生命周期。
  3. 高可用验证:通过创建多副本服务,验证了 Swarm 的调度能力,确认其能够将容器实例分发到不同的物理节点上运行,从而提升应用的可用性。

本次实验证明了 Docker Swarm 在处理多主机容器管理时的便捷性,为后续深入学习 Kubernetes 奠定了扎实的基础。