在 Swarm 模式下运行 Docker Engine

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

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

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

这些说明假设您已在将用作 Swarm 中管理器节点的机器上安装了 Docker Engine。

如果您尚未阅读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命令指定每个子网。

要配置自定义默认地址池,必须使用--default-addr-pool命令行选项在 Swarm 初始化时定义池。此命令行选项使用 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>]

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 标志。

配置公告地址

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

如果您未指定广告地址,Docker 将检查系统是否只有一个 IP 地址。如果是,Docker 默认使用具有侦听端口 2377 的 IP 地址。如果系统有多个 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

了解更多