在 swarm 模式下运行 Docker Engine
首次安装并开始使用 Docker Engine 时,Swarm 模式默认是禁用的。启用 Swarm 模式后,您将使用通过 docker service
命令管理的服务概念。
有两种方法在 Swarm 模式下运行 Engine
- 创建一个新的 swarm,本文将对此进行介绍。
- 加入现有 swarm.
在本地机器上以 Swarm 模式运行 Engine 时,您可以创建并测试基于您创建的镜像或其他可用镜像的服务。在生产环境中,Swarm 模式提供了一个具有集群管理功能的容错平台,可确保您的服务持续运行且可用。
这些说明假设您已在机器上安装了 Docker Engine,以便将其用作 swarm 中的管理器节点。
如果您还没有这样做,请阅读 Swarm 模式关键概念 并尝试 Swarm 模式教程。
创建 swarm
当您运行创建 swarm 的命令时,Docker Engine 将开始在 Swarm 模式下运行。
运行 docker swarm init
在当前节点上创建单节点 swarm。Engine 会按如下方式设置 swarm
- 将当前节点切换到 Swarm 模式。
- 创建一个名为
default
的 swarm。 - 将当前节点指定为 swarm 的领导者管理器节点。
- 使用机器主机名命名节点。
- 配置管理器监听活动网络接口的端口
2377
。 - 将当前节点设置为
Active
可用性,表示它可以接收调度器分配的任务。 - 为参与 swarm 的 Engine 启动一个内部分布式数据存储,以维护 swarm 及其上运行的所有服务的一致视图。
- 默认情况下,为 swarm 生成自签名根 CA。
- 默认情况下,为 worker 和 manager 节点生成加入 swarm 的令牌。
- 创建一个名为
ingress
的 overlay 网络,用于将服务端口发布到 swarm 外部。 - 为您的网络创建默认的 overlay IP 地址和子网掩码
docker swarm init
的输出提供了将新 worker 节点加入 swarm 时使用的连接命令
$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
配置默认地址池
默认情况下,Swarm 模式对全局范围 (overlay) 网络使用默认地址池 10.0.0.0/8
。每个未指定子网的网络都将从该地址池中按顺序分配一个子网。在某些情况下,可能需要为网络使用不同的默认 IP 地址池。
例如,如果默认的 10.0.0.0/8
范围与网络中已分配的地址空间冲突,则最好确保网络使用不同的范围,而无需 swarm 用户使用 --subnet
命令指定每个子网。
要配置自定义默认地址池,必须在 swarm 初始化时使用 --default-addr-pool
命令行选项定义地址池。此命令行选项使用 CIDR 表示法定义子网掩码。要为 Swarm 创建自定义地址池,您必须至少定义一个默认地址池,以及一个可选的默认地址池子网掩码。例如,对于 10.0.0.0/27
,使用值 27
。
Docker 从 --default-addr-pool
选项指定的地址范围中分配子网地址。例如,命令行选项 --default-addr-pool 10.10.0.0/16
表示 Docker 将从该 /16
地址范围分配子网。如果未指定 --default-addr-pool-mask-len
或将其显式设置为 24,则将得到 256 个 /24
网络,形式为 10.10.X.0/24
。
子网范围来自 --default-addr-pool
(例如 10.10.0.0/16
)。其中的 16 表示可以在该 default-addr-pool
范围内创建的网络数量。--default-addr-pool
选项可以出现多次,每个选项都为 docker 用于 overlay 子网提供额外的地址。
命令格式如下
$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]
为 10.20.0.0
网络创建带有 /16(B 类)默认 IP 地址池的命令如下所示
$ docker swarm init --default-addr-pool 10.20.0.0/16
为 10.20.0.0
和 10.30.0.0
网络创建带有 /16
(B 类)默认 IP 地址池,并为每个网络创建 /26
子网掩码的命令如下所示
$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26
在此示例中,docker network create -d overlay net1
将导致为 net1
分配子网 10.20.0.0/26
,而 docker network create -d overlay net2
将导致为 net2
分配子网 10.20.0.64/26
。这将持续进行,直到所有子网都被耗尽。
请参考以下页面了解更多信息
配置 Advertise 地址
管理器节点使用 advertise 地址允许 swarm 中的其他节点访问 Swarmkit API 和 overlay 网络。swarm 上的其他节点必须能够通过管理器节点的 advertise 地址访问它。
如果您未指定 advertise 地址,Docker 会检查系统是否只有一个 IP 地址。如果是,Docker 默认使用该 IP 地址和监听端口 2377
。如果系统有多个 IP 地址,您必须指定正确的 --advertise-addr
来启用管理器间通信和 overlay 网络
$ docker swarm init --advertise-addr <MANAGER-IP>
如果其他节点访问第一个管理器节点的地址与管理器认为其自身的地址不同,您也必须指定 --advertise-addr
。例如,在跨不同区域的云设置中,主机既有用于区域内访问的内部地址,也有用于从区域外访问的外部地址。在这种情况下,使用 --advertise-addr
指定外部地址,以便节点可以将该信息传播给随后连接到它的其他节点。
参考 docker swarm init
CLI 参考,详细了解 advertise 地址。
查看加入命令或更新 swarm 加入令牌
节点需要一个秘密令牌才能加入 swarm。worker 节点的令牌与 manager 节点的令牌不同。节点仅在加入 swarm 时使用 join-token。节点加入 swarm 后轮换 join token 不会影响节点的 swarm 成员身份。令牌轮换确保旧令牌无法被任何试图加入 swarm 的新节点使用。
要检索包含 worker 节点 join token 的加入命令,请运行
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
要查看 manager 节点 join 命令和令牌,请运行
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
192.168.99.100:2377
传递 --quiet
标志仅打印令牌
$ docker swarm join-token --quiet worker
SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
请小心处理 join tokens,因为它们是加入 swarm 所必需的 Secrets(密钥)。特别地,将 Secrets(密钥)提交到版本控制系统是一个不好的做法,因为它会允许任何有权访问应用程序源代码的人向 swarm 添加新节点。Manager 令牌尤其敏感,因为它们允许新的 manager 节点加入并控制整个 swarm。
我们建议您在以下情况下轮换 join tokens
- 如果令牌意外地被提交到版本控制系统、群聊或意外打印到您的日志中。
- 如果您怀疑节点已被入侵。
- 如果您希望确保没有新节点可以加入 swarm。
此外,最佳实践是为包括 swarm join tokens 在内的任何 Secrets(密钥)实施定期轮换计划。我们建议您至少每 6 个月轮换一次令牌。
运行 swarm join-token --rotate
使旧令牌失效并生成新令牌。指定您要为 worker
还是 manager
节点轮换令牌
$ docker swarm join-token --rotate worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
192.168.99.100:2377
了解更多
- 将节点加入 swarm
swarm init
命令行参考- Swarm 模式教程