准备工作
本次部署使用的 Docker 版本为 19.03.6,因服务器资源有限,文章只涉及 2 台机器的交互:
IP地址 | 操作系统 | 主机名 | 身份 |
---|---|---|---|
193.112.234.28 | CentOS 7.5 | m1 | 管理节点 |
106.11.248.146 | Ubuntu 16.04 | w1 | 工作节点 |
初始化集群
首先登入 m1 服务器(作为管理节点),执行以下命令初始化 Swarm 集群:
$ docker swarm init --advertise-addr 193.112.234.28:2377
Swarm initialized: current node (5uysirygjdai3jgbta1ue1zt4) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1w5mibq8je59igu38af3fb8bft0q37su0xuu8drs8nnc7jqe65-12mtjb131wecf1i3ilhp8gyal 193.112.234.28:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
--advertise-addr
参数用于指定其他节点连接集群的地址;由于 2 台服务器不在同一个网段,命令中使用的 IP 是公网地址,2377 是集群默认端口。
初始化完成后,列出集群的所有节点,查看 m1 节点的状态和身份:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5uysirygjdai3jgbta1ue1zt4 * m1 Ready Active Leader 19.03.6
同时开放 m1 服务器的 2377 端口,确保其他节点可以正常加入集群:
$ firewall-cmd --zone=public --add-port=2377/tcp --permanent
$ firewall-cmd --reload
$ firewall-cmd --zone=public --list-port
# 以上命令仅对 CentOS 7 系统生效,其他操作系统有所不同
加入工作节点
实际上在初始化集群后, m1 服务器的控制台就输出了加入集群的命令:
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1w5mibq8je59igu38af3fb8bft0q37su0xuu8drs8nnc7jqe65-12mtjb131wecf1i3ilhp8gyal 193.112.234.28:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
接下来登入 w1 服务器,将其作为工作节点加入 Swarm 集群:
$ docker swarm join \
--token SWMTKN-1-1w5mibq8je59igu38af3fb8bft0q37su0xuu8drs8nnc7jqe65-12mtjb131wecf1i3ilhp8gyal \
193.112.234.28:2377 --advertise-addr 106.11.248.146:2377
This node joined a swarm as a worker.
再次回到 m1 服务器,查看当前集群的节点状态,可见工作节点已经就绪:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
2u8wqdbtstvj1383rpjy1ywnp w1 Ready Active 19.03.6
5uysirygjdai3jgbta1ue1zt4 * m1 Ready Active Leader 19.03.6
其他说明
- 集群管理节点一般推荐分配 3 个或 5 个,一是奇数个管理节点有利于减少脑裂,二来限制管理节点的数量可以使集群内部更快达成共识。
- 假如要在集群中使用 routing mesh 机制,需要在初始化集群之前,开启所有节点的 7946 TCP、7946 UDP 和 4789 UDP 三个端口。
- 请勿将 Docker Swarm 模式应用于阿里云服务器,鉴于 Swarm 集群在云服务器上的不稳定性,阿里云已停止对 Swarm 的技术支持。