Windows Docker在与Linux节点连接时出现问题

30次阅读
没有评论

问题描述

在使用Docker Swarm时遇到了以下问题:
– 他的Docker Swarm配置如下:
– 三个Linux主节点
– 一个Linux从节点
– 一个Windows从节点
– 这些节点通过一个覆盖网络连接在一起。在Linux节点上一切正常。
– 但是,如果他在Windows容器(例如microsoft/nanoserver)中尝试使用容器的内部DNS名称ping一个Linux容器,DNS解析正常,但请求超时。
– 更奇怪的是,他的Linux容器有两个IP地址,一个是全局回环地址,另一个是相同网络中的地址。
– 假设Linux容器的全局回环地址是xx.xx.xx.2/32,另一个地址是xx.xx.xx.3/24。内部DNS解析到的IP是xx.xx.xx.2。但是从Windows容器无法ping通xx.xx.xx.2,但可以ping通xx.xx.xx.3。
– 如果他在Linux容器中,可以ping通xx.xx.xx.2地址。他还可以在Linux容器中使用curl命令访问Windows容器的服务(端口8080)。
– 这个问题很奇怪。有人遇到过类似的问题吗?或者我可以操纵Docker的内部DNS解析吗?
– 还有一个有趣的事实,之前是可以的。但在Windows节点离开和加入Swarm之后就不行了。
– 版本信息:
– Windows Server 2016 – Docker version 17.06.2-ee-6, build e75fdb8
– RedHat 7.4 (Maipo) – Docker version 17.12.0-ce, build c97c6d6
– 更新:Windows节点无法访问在Linux从节点上运行的容器,但其他容器可以正常ping通。但是从Linux主节点可以ping通在Linux从节点上运行的容器。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

首先,确保你的Windows Server 2016上安装的Docker版本是17.06.2-ee-6,这个版本应该支持覆盖网络和VIP。你可以使用以下命令来更新Docker:

Install-Package -Name docker -ProviderName DockerProvider -Update -Force

其次,ping命令可能不是一个很好的测试方法,因为根据设置的不同(Docker在VIP是否响应ping方面已经发生了变化),VIP或容器IP可能无法ping通。我建议使用一些测试容器端口的方法,比如使用curl命令。你可以使用像bretfisher/netshoot这样的容器,它已经安装了常用的工具。
另外,你可能是在使用服务名称来解析Swarm服务的网络,而不是容器的内部主机名。根据你在服务中使用的网络端点模式(VIP或DNSRR),这将为同一Docker网络中的其他容器解析正确的VIP或正确的容器IP。
此外,你需要至少3个管理节点来遵循Swarm的Raft一致性规则。2个管理节点实际上比1个管理节点更不具备容错性。

方案2

如果你的Windows Server 2016上的Docker版本已经是17.06.2-ee-6,并且你已经尝试了方案1中的解决方法,但问题仍然存在,你可以尝试以下方法:
1. 确保Windows上启用了IPv6(需要启用IPv6)。
2. 在Windows上尝试使用curl命令来访问Linux nginx容器,以测试网络连接。你可以使用以下命令:

Invoke-RestMethod -UseBasicParsing -Uri http://7e8574293552:8080

其中http://7e8574293552:8080是一个nginx容器的地址。
3. 如果问题仍然存在,请确保你的Swarm集群中的所有节点都正确配置,并且网络设置正确。
4. 如果问题仍然无法解决,请尝试重新加入Windows节点到Swarm集群中。

以上是解决这个问题的一些可能的方法。希望能对你有所帮助。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你解决问题。

正文完