【问题标题】:Do Windows Containers Support Multi-node SwarmWindows 容器是否支持多节点 Swarm
【发布时间】:2020-05-02 23:25:40
【问题描述】:

我已经按照这篇文章https://docs.docker.com/ee/docker-ee/windows/docker-ee/在 Windows Server 2016 上手动设置了 docker

我有两台 windows server 2016 hyper-v 机器共享同一个网络,我添加了防火墙规则以允许彼此之间的网络连接。

第一台机器拥有私有IP 192.168.192.254,另一台拥有私有IP 192.168.192.242,它们可以互相ping通。

我尝试在第一台机器上初始化 swarm 并使用以下命令 docker swarm init --advertise-addr 192.168.192.245:2377 --listen-addr 192.168.192.245:2377 但我收到以下错误 *

来自守护程序的错误响应:管理器已停止:无法侦听 远程API地址:listen tcp 192.168.192.245:2377:bind: 请求的地址在其上下文中无效。

* 然后我执行了以下命令

docker network inspect nat

下面是结果

看起来 docker 有自己的接口,并且它的网络 IP 与 hyper-v 默认开关不同!这意味着两台机器上的两个docker都不知道如何相互通信,如果我的理解是正确的,我该如何构建多节点集群?

我尝试做但失败的另一件事是初始化群并使用 docker 窗口范围内的 IP 地址,但我遇到了同样的问题

再次编辑:

现在它使用这个 IP:Port 192.168.192.243:2377 并且能够将第一个 hyper-v 虚拟机添加为管理器节点,但正如您所看到的其他机器无法加入集群。我注意到当我添加 --listen-addr 192.168.192.243:2377 时,我得到了与上面相同的错误。

我还禁用了两台机器上的防火墙,但没有任何效果

【问题讨论】:

  • 如果主机的IP地址为192.168.192.242,那么init命令不是docker swarm init --advertise-addr 192.168.192.242吗?为什么要尝试广告/绑定到其他 IP 地址(如 *.243*.245)?
  • 你是男人,很有魅力,请添加这个作为答案,我认为我可以使用网络子网中的任何 IP 地址,我不能将我的 docker 引擎附加到任何子网中的IP?也许我误解了这个概念。无论如何,非常感谢。
  • 另一件事,为什么advertise-addr 接受子网中的任何IP 而listen-addr 不接受

标签: docker windows-server-2016 swarm docker-network


【解决方案1】:

您需要为listen-addr 使用主机的IP 地址之一,因为顾名思义,它会尝试侦听该IP 地址。

advertise-addr,这是网络地址通告到其他节点(他们将使用该地址连接到集群)。

在大多数设置中,两者是相同的,但在某些情况下它们是不同的(例如,带有multiple network cards 的主机可能只希望在single network 中可以访问群,或者通过VPN 互连的主机可能想要群只能通过VPN interface 进行通信。
从理论上讲,您可以在NAT 接口后面有一个群管理器,在这种情况下,advertise-addr 将是 NAT 设备的(我只是在推测 NAT 的情况——我还没有尝试过)。

无论如何使用此初始化命令都应该适用于您的情况:
docker swarm init --advertise-addr 192.168.192.242

【讨论】:

  • 非常感谢,我不太明白为什么 Swarm 接受在特定地址上监听并宣传另一个地址,这真的不清楚。这就像告诉某人给你寄一个包裹到美国,而你在英国等待接收,这将如何运作,我真的不明白。
  • 例如:您可以监听所有地址 (0.0.0.0) 但您显然不能宣传该地址。另一个例子是使用 NAT:你监听你的家庭地址,但你宣传你叔叔的地址,因为你的房子无法使用联邦快递卡车到达; Fedex 会将包裹递送给您叔叔(NAT 设备),然后您的叔叔将包裹递送给您(他有一辆较小的卡车)。
  • 我明白了,我应该把重点放在答案中的 NAT 部分,因为它是一个很好的例子并解释了我的担忧。再次非常感谢。
  • @Iont 很高兴将 100 赏金奖励给您。有没有关于如何排查容器网络问题的指导,有什么好的文章吗?
  • 谢谢@MoHaidar!我使用的唯一来源是 Docker 的 docspingnetcattcpdump 等基本工具,用于在初始化 swarm 之前验证节点之间的连接。
猜你喜欢
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2020-02-19
  • 2021-10-01
  • 1970-01-01
  • 2013-10-15
相关资源
最近更新 更多