问题描述
在尝试通过互联网将新的节点添加到他的 Docker Swarm 中,但似乎无法通过代理连接。用户尝试使用 Caddy 进行代理,但代理配置对于其他类似于在 nginx 中使用 proxy_pass 的服务器也是一样的。Caddy 会自动为子域设置 HTTPS,并将所有流量从端口 80 重定向到 443。用户的 Caddy 配置如下:
swarm.mydomain.com {
proxy / http://<docker-swarm-manager-ip>:2377 {
transparent
}
}
从 Docker Swarm 管理器获得的加入令牌类似于:
docker swarm join --token <some-long-hash> <docker-swarm-manager-ip>:2377
在用户要连接到 Swarm 的节点上,他尝试了以下命令:
sudo docker swarm join --token <some-long-hash> swarm.mydomain.com
但是出现了以下错误:
Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
用户还尝试指定 SSL 端口:
sudo docker swarm join --token <some-long-hash> swarm.mydomain.com:443
但是出现了以下错误:
Error response from daemon: rpc error: code = FailedPrecondition desc = transport: received the unexpected content-type "text/plain; charset=utf-8"
用户是 Docker Swarm 的新手,无法在网上找到类似的设置。他寻求帮助。
解决方案
为了解决这个问题,需要注意 Docker Swarm 节点之间的通信方式和端口。Swarm 节点需要在以下端口上进行直接通信:2377/tcp(或您配置的 Swarm 端口)、7946/both 和 4789/udp。如果您在节点之间使用了具有 IPSec 安全选项的叠加网络,则还需要打开节点之间的协议 50。
步骤
- 更新 Caddy 配置:首先,您需要更新 Caddy 配置,不指定端口号。您的配置应该类似于:
swarm.mydomain.com {
proxy / http://<docker-swarm-manager-ip> {
transparent
}
}
-
打开所需端口:确保端口 7946 和 4789 在您的节点上已经打开。
-
使用正确的命令:在要连接到 Swarm 的节点上,使用正确的命令进行连接。命令应该类似于:
sudo docker swarm join --token <some-long-hash> <docker-swarm-manager-ip>:2377
- 如果需要在私有网络中连接非互联网可访问的系统,考虑使用 VPN。
需要注意的是,使用代理来代替直接连接 Swarm 节点可能会引入复杂性,并且可能无法正常工作。建议尽可能避免在这种情况下使用代理。
以上步骤应该能够帮助您解决 Docker Swarm 节点加入问题。如果您有任何进一步的疑问或问题,欢迎提问。
正文完