docker - 无法访问在 docker swarm 集群中运行的服务
问题描述
我有一个带有以下节点的 docker swarm 集群
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager1 - virtualbox Running tcp://192.168.99.113:2376 v19.03.12
worker1 - virtualbox Running tcp://192.168.99.114:2376 v19.03.12
worker2 - virtualbox Running tcp://192.168.99.115:2376 v19.03.12
我在管理器节点上创建了如下服务
$ docker service create --name registry --publish 5000:5000 registry:2
现在我可以从任何 swarm 节点访问该服务
$ curl localhost:5000/v2/_catalog
{"repositories":[]}
但是,如果我尝试从 swarm 集群外部访问该服务,我会收到此错误
$ curl localhost:5000/v2/_catalog
curl: (7) Failed to connect to localhost port 5000: Connection refused
我们如何从主机访问在 swarm 集群中运行的服务
解决方案
使用路由网格发布服务的端口
要将服务的端口发布到 swarm 外部,请使用 --publish : 标志。swarm 使服务可以在每个 swarm 节点上的已发布端口上访问。如果外部主机连接到任何 swarm 节点上的该端口,路由网格会将其路由到任务。外部主机不需要知道服务任务的 IP 地址或内部使用的端口来与服务交互。当用户或进程连接到服务时,任何运行服务任务的工作节点都可能响应。有关 swarm 服务网络的更多详细信息,请参阅管理 swarm 服务网络。
示例:在 10 节点 swarm 上运行三任务 Nginx 服务假设您有一个 10 节点 swarm,并且您在 10 节点 swarm 上部署了一个运行三个任务的 Nginx 服务:
$ docker service create --name my_web \
--replicas 3 \
--publish published=8080,target=80 \
nginx
三个任务最多在三个节点上运行。您不需要知道哪些节点正在运行任务;连接到 10 个节点中的任何一个上的端口 8080 会将您连接到三个 nginx 任务之一。您可以使用 curl 进行测试。以下示例假设 localhost 是 swarm 节点之一。如果不是这种情况,或者 localhost 没有解析到主机上的 IP 地址,请替换主机的 IP 地址或可解析的主机名。
HTML 输出被截断:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...truncated...
</html>
后续连接可能会路由到同一个 Swarm 节点或不同的节点。
推荐阅读
- javascript - Js推入数组,该数组位于具有多个数组的对象中
- botframework - Microsoft 网络聊天自动滚动
- javascript - SHA256 Hashing Large files in angular 6 using Filereader Issue
- python - 简化 main1.py 或 main2.py 调用 middle.py 调用 sub1.py 或 sub2.py
- node.js - 无法在 NodeJS 应用程序中的 Heroku 上添加 npm 模块
- awk - 如何使用 bash 替换文件中非常复杂的文本?
- ruby-on-rails - 使用条纹宝石进行条纹异常双重渲染
- swift - 将文件上传到 S3 服务 403 错误 (com.amazonaws.AWSS3TransferUtilityErrorDomain 错误 2.) Swift iOS
- javascript - 使用 Vue Test Utils 测试嵌套 div
- qt-creator - 安装后如何将 Qt 工具包添加到 Qt 创建器?