以集群模式运行Docker Engine

预计阅读时间:8分钟

首次安装并开始使用Docker Engine时,默认情况下,群集模式是禁用的。启用群模式时,将使用通过docker service命令管理的服务概念。

有两种在群集模式下运行引擎的方法:

在本地计算机上以集群模式运行Engine时,可以基于已创建的图像或其他可用图像来创建和测试服务。在您的生产环境中,群集模式提供了具有群集管理功能的容错平台,以使您的服务保持运行和可用。

这些说明假定您已在计算机上安装了Docker Engine 1.12或更高版本,以充当集群中的管理器节点。

如果还没有,请通读Swarm模式的关键概念 并尝试Swarm模式教程

建立一群

当您运行命令创建集群时,Docker引擎将开始以集群模式运行。

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

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

docker swarm init当您将新的工作程序节点加入集群时,输出的for提供了连接命令:

$ 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.

配置默认地址池

默认情况下,Docker 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

为和网络创建一个默认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 net110.20.0.0/26成为的分配子网net1,并且docker network create -d overlay net210.20.0.64/26成为的分配子网net2。这一直持续到所有子网都用尽为止。

请参阅以下页面以获取更多信息:

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

配置发布地址

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

如果您未指定播发地址,则Docker将检查系统是否具有单个IP地址。如果是这样,2377默认情况下,Docker将IP地址与侦听端口一起 使用。如果系统具有多个IP地址,则必须指定正确的名称--advertise-addr以启用管理器间通信和覆盖网络:

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

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

有关播发地址的更多详细信息,请参考docker swarm init CLI参考

查看加入命令或更新群加入令牌

节点需要一个秘密令牌才能加入群集。工作节点的令牌与管理节点的令牌不同。节点仅在加入群集时使用连接令牌。节点已加入群集后旋转联接令牌不会影响该节点的群集成员身份。令牌轮换可确保旧令牌无法被任何试图加入群集的新节点使用。

要检索包括工作节点的加入令牌的加入命令,请运行:

$ 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 worker 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

学到更多

引导群模式节点