问题描述
想要将他的Windows机器连接/加入到一个Linux Docker Swarm集群,以便在不反复将堆栈发送到Linux测试集群的情况下测试堆栈。他的问题是无法使用Windows Docker加入到集群中。
用户的集群最初有1个管理节点和4个工作节点。最近,他添加了一个新的管理节点,以便将他的Windows Docker节点作为管理节点添加到集群中。这样,他不应该在管理节点数量上出现问题(因为他的两个管理节点将始终处于活动状态,而Windows Docker可能随时中断)。
用户已经在本地防火墙以及Linux集群的每个节点上配置了接受端口连接的规则,这些规则可以在文档的末尾找到:
- TCP端口2377用于集群管理通信
- TCP和UDP端口7946用于节点之间的通信
- UDP端口4789用于覆盖网络流量
集群中的广播网络为192.168.0.0/24
,其中一个管理节点的IP地址为192.168.0.100
,用户的PC的IP地址为192.168.0.143
(位于同一网络)。他们可以相互ping通,用户还测试了上述定义的端口。
然后,用户在一个管理节点上执行了docker swarm join-token manager
命令,得到了类似以下的结果:
docker swarm join --token SWMTKN-1-27hzpcnek5... 192.168.0.200:2377
如果将这个命令复制/粘贴到用户的PC上,就会得到一个错误:
Error response from daemon: manager stopped: can't initialize raft node: rpc error: code = Unknown desc = could not connect to prospective new cluster member using its advertised address: rpc error: code = DeadlineExceeded desc = context deadline exceeded
尽管出现错误,但在集群上运行docker node ls
命令时,用户的节点出现在列表中:
8380zb5jeke0elwohr7aieke8 linuxkit-00155d00d946 Ready Active
但是在用户的PC上,Docker认为它不是集群的成员:
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
集群和用户的PC上的Docker版本不同:
集群:
– 客户端:17.09.1-ce
– 服务器:17.09.1-ce
PC:
– 客户端:18.03.1-ce
– 服务器:18.03.1-ce
问题可能出在这里吗?
用户使用的是Windows上的Bash(在Windows Subsystem for Linux上),但在PowerShell上结果是一样的。
用户不确定是否有用,但由于Docker for Windows使用Hyper-V,他有一个NAT接口:10.0.75.0/24
(虚拟机的IP地址是10.0.75.1
)。他尝试使用这个接口作为广播地址和监听地址,但问题仍然存在。
是否有人遇到过这个问题?有什么建议吗?
解决方案
请注意以下操作可能因版本差异而有所不同,同时在执行任何操作前请务必做好备份。
方案1:使用SSH隧道连接Docker Socket
在你的情况下,为了在Windows环境中连接到Linux Docker Swarm集群,你可以使用SSH隧道来暴露Docker Socket并将Docker CLI绑定到Swarm管理节点。以下是操作步骤:
- 在Windows上安装OpenSSH客户端,以便能够使用SSH命令。
- 打开一个终端(Bash、PowerShell等)。
- 使用以下命令建立SSH隧道,将Linux管理节点的Docker Socket映射到本地端口:
ssh -M -S ~/.docker.sock -fnNT -4 -L localhost:1337:/var/run/docker.sock USER@MANAGER_IP
请将USER
替换为你的用户名,MANAGER_IP
替换为Linux管理节点的IP地址。此命令将创建一个SSH隧道,将Linux管理节点的Docker Socket映射到本地端口1337
。
- 在同一个终端中,设置
DOCKER_HOST
环境变量,使Docker CLI绑定到本地的Docker Socket:
export DOCKER_HOST=localhost:1337
现在,你可以在Windows环境中使用Docker CLI,就好像在Linux节点上工作一样。
方案2:统一Docker版本
尽管您在集群和PC上运行不同版本的Docker,但为了减少问题,建议统一Docker版本。确保您在集群和PC上都运行相同版本的Docker。在您的情况下,尝试将集群和PC上的Docker版本都升级到18.03.1-ce
。
请注意,集群中的Docker引擎版本应保持一致,特别是在添加、删除、升级节点时。在需要升级管理节点上的Docker引擎时,可以在不进行升级/降级的情况下直接在现有节点上进行升级。但应尽量减少在这种状态下的时间,并避免在Swarm中使用任何更新的功能。
方案3:使用--advertise-addr
参数
在您的情况下,还需要在docker join
命令中使用--advertise-addr
参数来指定广播地址。您之前遇到的错误可能是因为广播地址不正确导致的。例如:
“`shell
docker swarm join –token SWMTKN-1-27hz