在 swarm 模式下运行 Docker Engine
当您首次安装并开始使用 Docker Engine 时,Swarm 模式默认是禁用的。当您启用 Swarm 模式时,您将使用通过 docker service 命令管理的服务概念。
有两种方式可以在 Swarm 模式下运行引擎:
- 创建一个新的 swarm,本文将对此进行介绍。
- 加入一个现有的 swarm.
当您在本地计算机上以 Swarm 模式运行引擎时,您可以基于自己创建的镜像或其他可用镜像来创建和测试服务。在您的生产环境中,Swarm 模式提供了一个具有集群管理功能的容错平台,以保持您的服务持续运行和可用。
这些说明假定您已在一台计算机上安装了 Docker Engine,该计算机将作为 swarm 中的管理节点。
如果您还没有阅读过 Swarm 模式关键概念,请先阅读,并尝试 Swarm 模式教程。
创建 swarm
当您运行创建 swarm 的命令时,Docker Engine 开始以 Swarm 模式运行。
运行 docker swarm init 在当前节点上创建一个单节点 swarm。引擎会按以下方式设置 swarm:
- 将当前节点切换到 Swarm 模式。
- 创建一个名为
default的 swarm。 - 将当前节点指定为 swarm 的领导者管理节点。
- 使用计算机主机名命名该节点。
- 配置管理器在活动网络接口的
2377端口上监听。 - 将当前节点设置为
Active可用性,这意味着它可以接收来自调度器的任务。 - 为参与 swarm 的引擎启动一个内部分布式数据存储,以维护对 swarm 及在其上运行的所有服务的一致视图。
- 默认情况下,为 swarm 生成一个自签名的根 CA。
- 默认情况下,为工作节点和管理节点生成加入 swarm 的令牌。
- 创建一个名为
ingress的覆盖网络,用于向 swarm 外部发布服务端口。 - 为您的网络创建覆盖网络的默认 IP 地址和子网掩码。
docker swarm init 的输出提供了当您将新的工作节点加入 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 模式对全局范围(覆盖)网络使用默认地址池 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 个形式为 10.10.X.0/24 的 /24 网络。
子网范围来自 --default-addr-pool(例如 10.10.0.0/16)。这里的 16 大小表示可以在该 default-addr-pool 范围内创建的网络数量。--default-addr-pool 选项可以多次出现,每个选项都提供额外的地址供 Docker 用于覆盖网络子网。
该命令的格式是:
$ 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 将导致 10.20.0.0/26 作为 net1 的分配子网,而 docker network create -d overlay net2 将导致 10.20.0.64/26 作为 net2 的分配子网。这将持续进行,直到所有子网都被用尽。
有关更多信息,请参阅以下页面:
配置通告地址
管理节点使用一个通告地址(advertise address)来允许 swarm 中的其他节点访问 Swarmkit API 和覆盖网络。swarm 上的其他节点必须能够通过其通告地址访问管理节点。
如果您不指定通告地址,Docker 会检查系统是否只有一个 IP 地址。如果是,Docker 默认使用该 IP 地址和监听端口 2377。如果系统有多个 IP 地址,您必须指定正确的 --advertise-addr 以启用管理器间通信和覆盖网络。
$ docker swarm init --advertise-addr <MANAGER-IP>
如果其他节点访问第一个管理节点的地址与该管理节点自身看到的地址不同,您也必须指定 --advertise-addr。例如,在一个跨越不同区域的云设置中,主机既有用于区域内访问的内部地址,也有用于从该区域外部访问的外部地址。在这种情况下,请使用 --advertise-addr 指定外部地址,以便该节点可以将该信息传播给随后连接到它的其他节点。
请参阅 docker swarm init CLI 参考,了解有关通告地址的更多详细信息。
查看加入命令或更新 swarm 加入令牌
节点需要一个秘密令牌才能加入 swarm。工作节点的令牌与管理节点的令牌不同。节点仅在加入 swarm 的那一刻使用加入令牌。在节点已经加入 swarm 后轮换加入令牌不会影响该节点的 swarm 成员身份。令牌轮换可确保旧令牌不能被任何试图加入 swarm 的新节点使用。
要检索包括工作节点加入令牌在内的加入命令,请运行:
$ 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.
要查看管理节点的加入命令和令牌,请运行:
$ 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
请小心处理加入令牌,因为它们是加入 swarm 所必需的秘密。特别地,将秘密检入版本控制是一种不好的做法,因为它将允许任何有权访问应用程序源代码的人向 swarm 中添加新节点。管理令牌尤其敏感,因为它们允许新的管理节点加入并获得对整个 swarm 的控制权。
我们建议您在以下情况下轮换加入令牌:
- 如果令牌被意外检入版本控制系统、群聊或意外打印到您的日志中。
- 如果您怀疑某个节点已遭入侵。
- 如果您希望保证没有新节点可以加入 swarm。
此外,为任何秘密(包括 swarm 加入令牌)实施定期的轮换计划是一种最佳实践。我们建议您至少每 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 模式教程