以 Swarm 模式运行 Docker 引擎

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

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

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

这些说明假设您已在计算机上安装了 Docker 引擎以充当 swarm 中的管理节点。

如果您还没有阅读 Swarm 模式关键概念 并尝试Swarm 模式教程,请阅读该教程。

创建一个群

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

运行 docker swarm init 以在当前节点上创建单节点 swarm。引擎按如下方式设置群体:

  • 将当前节点切换到 Swarm 模式。
  • 创建一个名为 的群default
  • 将当前节点指定为 swarm 的领导者管理器节点。
  • 使用计算机主机名命名节点。
  • 将管理器配置为侦听端口“2377”上的活动网络接口。
  • 将当前节点设置为Active可用性,这意味着它可以从调度程序接收任务。
  • 为参与集群的引擎启动内部分布式数据存储,以维护集群及其上运行的所有服务的一致视图。
  • 默认情况下,为 swarm 生成自签名根 CA。
  • 默认情况下,为工作节点和管理节点生成令牌以加入集群。
  • 创建一个覆盖网络,命名ingress为在集群外部发布服务端口。
  • 为您的网络创建覆盖默认 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.

配置默认地址池

10.0.0.0/8默认情况下,Swarm 模式使用全局范围(覆盖)网络的默认地址池。每个未指定子网的网络都将从该池中按顺序分配一个子网。在某些情况下,可能需要为网络使用不同的默认 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 个/24形式的网络10.10.X.0/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>]

为网络创建带有 /16(B 类)的默认 IP 地址池的命令10.20.0.0如下所示:

$ docker swarm init --default-addr-pool 10.20.0.0/16

为和网络创建默认 IP 地址池/16(B 类)并为每个网络创建子网掩码的命令如下所示:10.20.0.010.30.0.0/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。这将持续到所有子网都用完为止。

请参阅以下页面了解更多信息:

  • Swarm 网络了解有关默认地址池使用情况的更多信息
  • docker swarm init CLI 参考以获取有关该标志的更多详细信息--default-addr-pool

配置发布地址

管理器节点使用广告地址来允许群中的其他节点访问 Swarmkit API 和覆盖网络。群上的其他节点必须能够访问其通告地址上的管理器节点。

如果您不指定广告地址,Docker 会检查系统是否有单个 IP 地址。如果是这样,Docker2377默认使用带有侦听端口的 IP 地址 。如果系统有多个 IP 地址,您必须指定正确的 IP 地址--advertise-addr以启用管理器间通信和覆盖网络:

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

--advertise-addr如果其他节点到达第一个管理器节点的地址与管理器视为自己的地址不同,您还必须指定。例如,在跨越不同区域的云设置中,主机既有用于在该区域内访问的内部地址,也有用于从该区域外部访问的外部地址。在这种情况下,请指定外部地址,--advertise-addr以便节点可以将该信息传播到随后连接到它的其他节点。

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

查看加入命令或更新 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

请小心加入令牌,因为它们是加入群体所需的秘密。特别是,将秘密检查到版本控制中是一种不好的做法,因为它将允许任何有权访问应用程序源代码的人向集群添加新节点。管理器令牌特别敏感,因为它们允许新的管理器节点加入并获得对整个群的控制权。

我们建议您在以下情况下轮换加入令牌:

  • 如果令牌被意外签入版本控制系统、群聊或意外打印到您的日志中。
  • 如果您怀疑某个节点已受到损害。
  • 如果你想保证没有新的节点可以加入群。

此外,最佳实践是为任何秘密(包括群体加入令牌)实施定期轮换计划。我们建议您至少每 6 个月轮换一次代币。

运行swarm join-token --rotate使旧令牌失效并生成新令牌。指定是否要旋转workermanager 节点的令牌:

$ 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

了解更多