在群集模式下运行 Docker Engine

当首次安装并开始使用 Docker Engine 时,Swarm 模式默认是禁用的。启用 Swarm 模式后,您将开始通过 docker service 命令来管理服务的概念。

有两种方式可以在Swarm模式下运行引擎:

当您在本地机器上以Swarm模式运行引擎时,您可以基于已创建或其他可用的镜像来创建和测试服务。在生产环境中,Swarm模式提供了一个具有集群管理功能的容错平台,以确保您的服务持续运行并保持可用。

这些说明假设您已在作为群集管理器节点的机器上安装了 Docker Engine。

如果尚未阅读,请先查阅 Swarm 模式核心概念 并尝试完成 Swarm 模式教程

创建一个 Swarm

当您运行创建 Swarm 的命令时,Docker Engine 将开始以 Swarm 模式运行。

运行 docker swarm init 在当前节点上创建一个单节点 Swarm。引擎将按以下方式设置 Swarm:

  • 将当前节点切换到 Swarm 模式。
  • 创建一个名为 default 的集群。
  • 将当前节点指定为群集的领导者管理节点。
  • 使用主机名命名节点。
  • 配置管理器以在端口 `2377` 上的活动网络接口上监听。
  • 将当前节点设置为 Active 可用状态,表示该节点可以接收来自调度器的任务。
  • 为参与集群的引擎启动一个内部分布式数据存储,以维护对集群及其上运行的所有服务的一致性视图。
  • 默认情况下,为集群生成自签名根 CA。
  • 默认情况下,会生成用于工作节点和管理员节点加入集群的令牌。
  • 创建一个名为 ingress 的覆盖网络,用于将服务端口发布到 Swarm 外部。
  • 为您的网络创建覆盖默认IP地址和子网掩码

docker swarm init 的输出提供了在将新工作节点加入集群时要使用的连接命令:

$ 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 命令指定每个子网。

要配置自定义默认地址池,您必须在集群初始化时使用命令行选项--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.010.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。此过程持续进行, 直到所有子网耗尽为止。

有关更多信息,请参阅以下页面:

  • Swarm 网络 有关默认地址池用法的更多信息
  • docker swarm init CLI 参考手册 以获取有关 --default-addr-pool 标志的更多详细信息。

配置广告地址

Manager节点使用一个广播地址(advertise address),以便Swarm中的其他节点能够访问Swarmkit API和覆盖网络。Swarm中的其他节点必须能够通过该广播地址访问Manager节点。

如果您未指定广播地址,Docker 将检查系统是否仅有一个 IP 地址。如果是这样,Docker 默认使用监听端口为 2377 的 IP 地址。如果系统有多个 IP 地址,您必须指定正确的 --advertise-addr 以启用管理节点间的通信和覆盖网络:

$ docker swarm init --advertise-addr <MANAGER-IP>

如果其他节点访问第一个管理节点的地址与管理节点自身看到的地址不同,您还必须指定 --advertise-addr。例如,在跨越不同区域的云环境中,主机同时拥有用于区域内部访问的内部地址和用于从区域外部访问的外部地址。在这种情况下,请指定带有 --advertise-addr 的外部地址,以便该节点能够将此信息传播给随后连接到它的其他节点。

有关广告地址的更多详细信息,请参阅 docker swarm init CLI 引用

查看 join 命令或更新 Swarm 加入令牌

节点需要密钥令牌才能加入集群。工作节点的令牌与管理节点的令牌不同。节点仅在加入集群时使用 join-token。在节点已经加入集群后轮转该 token 不会影响该节点的集群成员身份。轮转 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.

要查看管理节点的加入命令和令牌,请运行:

$ 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 加入令牌)是一项最佳实践。我们建议您至少每 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

了解更多