本教程适用于以下操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 16.04(Xenial Xerus)
本页内容
- 准备工作
- 设置系统:为 Docker Swarm 开放端口、添加 Docker 仓库
- 安装 Docker Engine
- (可选):允许非 root 用户运行 Docker 容器
- 创建 Docker Swarm:在 Master/Manager 上初始化 Swarm 模式、将工作节点加入 Docker Swarm
- 在 Docker Swarm 中运行服务
- 在 Docker Swarm 中扩展服务
- 在 Docker Swarm 中删除服务
- 总结
- 为 Docker Swarm 开放端口
- 添加 Docker 仓库
- 在 Master/Manager 上初始化 Swarm 模式
- 将工作节点加入 Docker Swarm
Docker Swarm 是构建在 Docker Engine 之上的容器编排工具。它允许你在多台服务器上创建并部署由多个 Docker 节点组成的集群。Docker Swarm 将容器化应用的部署简化为一个服务,并提供了一种简单、易用的方式来管理和编排容器。
Docker Swarm 提供高可用级别的应用。在 Docker Swarm 中,你可以在多个节点上运行同一个应用或服务,这些节点被称为“工作节点(Worker Nodes)”。此外还有一个称为“Swarm Manager”的节点,它是 Docker Swarm 的中央管理与编排节点。
在本教程中,我们将逐步演示如何在 Ubuntu 22.04 服务器上安装 Docker Swarm 软件。
准备工作
要完成本指南,请确保你具备以下条件:
- 3 台 Ubuntu 22.04 服务器——其中一台用作 Swarm Master/Manager,另外两台用作工作节点(Worker Nodes)。
- 一个具备 sudo 管理员权限的非 root 用户。
设置系统
在安装 Docker 并配置 Docker Swarm 之前,你必须先完成以下任务来准备系统:
- 为 Docker Swarm 开放端口:你必须在所有服务器上开放 Docker Swarm 使用的一些端口。这可以通过 UFW(Uncomplicated Firewall)来实现。
- 添加 Docker 仓库:你将使用官方 Docker 仓库为所有服务器安装 Docker Engine。
为 Docker Swarm 开放端口
在下面的步骤中,你将在 Swarm Master/Manager 和 Swarm 节点上通过 UFW(Uncomplicated Firewall)开放 SSH 的 22 端口,以及 Docker Swarm 使用的 2377、7946 和 4789 端口。UFW 默认已安装,但尚未启动。
首先,运行下面的 ufw 命令以添加 OpenSSH 应用配置并开放默认的 SSH 端口 22。然后启动并启用 UFW。
sudo ufw allow OpenSSH
sudo ufw enable
输入 y 继续,你应该会看到输出“Firewall is active and enabled on system startup(防火墙已激活并在系统启动时启用)”。

现在运行以下命令,开放 Swarm 部署中服务将要使用的端口。在本例中,你将为服务分配 30000:35000 之间的端口。
sudo ufw allow 30000:35000/tcp
接下来,执行以下命令为 Docker Swarm 开放端口。
for ports in 2377/tcp 7946/tcp 7946/udp 4789/udp
do
sudo ufw allow $ports
done

最后,重新加载 UFW 并通过执行以下命令验证 UFW 状态。
sudo ufw reload
sudo ufw status
你应该能看到 OpenSSH 应用配置,以及 UFW 上已启用的 Docker Swarm 端口,包括 2377、7946 和 4789。

添加 Docker 仓库
配置好 UFW 之后,你必须将官方 Docker 仓库添加到你的服务器。你将使用官方 Docker 仓库来安装 Docker Engine。
执行以下命令,在你的 Ubuntu 服务器上安装一些基础软件包。
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

接下来,运行以下命令将 Docker GPG 密钥和仓库添加到你的系统。
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最后,通过执行以下命令更新并刷新每台服务器上的 Ubuntu 仓库。
sudo apt update
你应该能在过程中看到正在获取 Docker 仓库。

安装 Docker Engine
在准备好 Ubuntu 系统之后,你将把 Docker Engine 安装到这些服务器上。
使用以下命令将 Docker Engine 安装到你的 Ubuntu 系统。输入 y 确认安装。
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,运行以下 systemctl 命令来验证 docker 服务,并确保该服务正在运行。
sudo systemctl is-enabled docker
sudo systemctl status docker
在以下输出中,你应该能看到 docker 服务正在运行且已启用。

(可选):允许非 root 用户运行 Docker 容器
如果你使用非 root 用户来部署 Docker Swarm 并运行容器,必须将你的用户加入 docker 组,这样该用户才能执行 docker 命令并运行容器。
运行以下 usermod 命令,将当前用户加入 docker 组。
sudo usermod -aG docker username
现在以非 root 用户身份登录,并执行以下 docker 命令来验证你的配置。
su - username
docker run hello-world
如果配置成功,你应该能够运行 hello-world 容器并得到以下输出:

创建 Docker Swarm
既然已经安装了 Docker Engine,你就可以使用 Ubuntu 服务器来创建并启动 Docker 了。在本示例中,我们将使用一台服务器作为 Swarm Master/Manager,另外两台服务器作为工作节点(Worker Nodes)。
完成以下任务以搭建 Docker Swarm:
- 在 Master/Manager 上初始化 Swarm 模式。
- 将工作节点加入 Docker Swarm。
我们开始吧。
在 Master/Manager 上初始化 Swarm 模式
要初始化 Docker Swarm,运行以下 docker swarm init 命令。附加参数 --advertise-addr 会将 Docker Swarm 绑定到指定的 IP 地址,而参数 --default-addr-pool 则决定 Swarm 上运行容器的内部 IP 地址池。
在本示例中,Docker Swarm 模式将绑定到 IP 地址 192.168.5.30,容器的 IP 地址池为 10.20.0.0/16。
docker swarm init --advertise-addr 192.168.5.30 --default-addr-pool 10.20.0.0/16
如果初始化过程成功,将显示以下输出。在输出中,你应该能看到为添加节点到 Docker Swarm 而生成的令牌(token)。

接下来,运行以下命令检查 Swarm 模式的状态。
docker info
如果 Swarm 模式已启用,你应该会看到包含“Swarm: active”的输出,以及 NodeID、Manager 和 Node 的状态详情。

最后,执行以下命令验证 Docker Swarm 上的节点列表。
docker node ls
此时,你的 Docker Swarm 上只有一个可用节点,即 Swarm Master/Manager。

将工作节点加入 Docker Swarm
初始化 Docker Swarm 之后,你就可以将工作节点添加到你的 Docker Swarm 中。
首先,运行以下命令查看为工作节点生成的令牌。
docker swarm join-token worker
你应该能看到添加工作节点的说明,其中包含该令牌。

现在,切换到工作节点,并执行以下 docker swarm join 命令将该工作节点加入 Docker Swarm。
docker swarm join --token SWMTKN-1-0i6kbe2oek1iw19jfpvd2j5l0dhfmssz4w505aeihx7ouz8wqc-2dbk7cnmo12uunj53eywwnqr7 192.168.5.30:2377
当过程成功时,屏幕上将输出“This node joined a swarm as a worker(该节点已作为工作节点加入 Swarm)”。


接下来,切回 Swarm Master/Manager,并运行以下命令验证可用节点的列表。
docker node ls
如果一切顺利,Docker Swarm 上将有三台可用服务器:1 台 Swarm Manager 和 2 台状态为 Ready、可用性为 running 的工作节点。

在 Docker Swarm 中运行服务
至此,你已经成功用三台 Ubuntu 服务器创建了 Docker Swarm。现在,你将学习如何将应用部署到 Docker Swarm 中,这被称为一个服务(service)。服务是你微服务应用的一个镜像,它可以是一个 HTTP 服务器、数据库服务器或其他应用。
在本示例中,你将使用 Nginx 镜像部署一个简单的 HTTP 服务。
执行以下命令在你的 Swarm 上创建一个新服务。在本示例中,你将创建一个名为 test-nginx 的新服务,包含 1 个副本,暴露端口 30001,并基于 nginx:alpine 镜像。
docker service create --replicas 1 --name test-nginx -p 30001:80 nginx:alpine

现在,使用以下命令查看 test-nginx 服务的详情。
docker service inspect test-nginx
docker service inspect --pretty test-nginx
你应该能看到类似如下的 test-nginx 服务详细信息。

接下来,使用以下命令验证 Docker Swarm 中的服务列表。
docker service ls
docker service ps test-nginx
如果成功,你应该能看到 test-nginx 服务运行在 manager 节点上,包含 1 个副本,并暴露端口 30001。

最后,使用以下 curl 命令通过主机 IP 地址和端口 30001 访问 test-nginx 服务。
curl 192.168.5.30:30001
curl -I 192.168.5.30:30001
你应该能看到 index.html 的源代码页面以及 HTTP 头的详情。

在 Docker Swarm 中扩展服务
既然已经部署了 Docker 服务,接下来的任务是在 Docker Swarm 上扩展该服务。这将在各个工作节点上创建你所需的服务副本。
要扩展服务,运行以下 docker service scale 命令。在本例中,你将把 test-nginx 服务扩展到 3 个副本。
docker service scale test-nginx=3

现在运行以下命令来验证 test-nginx 服务。如果 test-nginx 服务已扩展,你应该能看到 Docker 另外创建的 2 个服务,它们正在两台工作节点上运行。
docker service ps test-nginx

切换到工作节点终端,并运行以下命令确认 test-nginx 服务正在运行。
docker ps
curl 192.168.5.31:30001
如果一切顺利,你应该能在每台工作节点上看到状态为 Up 的容器 test-nginx.RANDOM-STRING。


在 Docker Swarm 中删除服务
为了清理环境,你将把 test-nginx 服务从 Docker Swarm 中删除,并移除 nginx:alpine 这个 docker 镜像。
使用以下命令删除 test-nginx 服务,并验证 Docker Swarm 上的可用服务列表。
docker service rm test-nginx
docker service ps
现在使用以下命令移除 nginx:alpine 镜像,并查看每台服务器上已下载的镜像列表。
docker rmi nginx:alpine
docker images
总结
总结一下,你已经成功地在 Ubuntu 22.04 上逐步安装了 Docker Swarm。你使用三台 Ubuntu 服务器部署了 Docker Swarm,并学习了如何在 Docker Swarm 上部署、扩展和移除应用或服务。