无法访问在 docker swarm 集群中运行的服务

时间:2021-03-04 10:27:15

标签: docker ubuntu 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集群中运行的服务

2 个答案:

答案 0 :(得分:0)

使用路由网格发布服务的端口

要将服务的端口发布到 swarm 外部,请使用 --publish : 标志。 swarm 使服务可以在每个 swarm 节点上的已发布端口上访问。如果外部主机连接到任何 swarm 节点上的该端口,路由网格会将其路由到任务。外部主机不需要知道服务任务的 IP 地址或内部使用的端口来与服务交互。当用户或进程连接到服务时,任何运行服务任务的工作节点都可以响应。有关 swarm 服务网络的更多详细信息,请参阅 Manage swarm service networks

示例:在 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>

后续连接可能路由到同一个群节点或不同的节点。

答案 1 :(得分:0)

最后我可以使用这个命令访问服务 curl <manager/worker ip>:5000/v2/_catalog