无法访问 docker swarm 集群中的服务 运行
Unable to access service running in docker swarm cluster
我有一个 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 服务网络的更多详细信息,请参阅 Manage swarm service networks。
示例:运行 10 节点集群上的三任务 Nginx 服务
想象一下,你有一个 10 节点的集群,你部署了一个 Nginx 服务 运行在一个 10 节点的集群上执行三个任务:
$ docker service create --name my_web \
--replicas 3 \
--publish published=8080,target=80 \
nginx
最多三个节点上的三个任务 运行。您不需要知道哪些节点正在 运行 执行任务;连接到 10 个节点中的任何一个上的端口 8080 会将您连接到三个 nginx 任务之一。您可以使用 curl 对此进行测试。以下示例假定 localhost 是 swarm 节点之一。如果不是这种情况,或者本地主机未解析为主机上的 IP 地址,请替换为主机的 IP 地址或可解析的主机名。
HTML 输出是 t运行 满足:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...truncated...
</html>
后续连接可能会路由到同一个群节点或不同的群节点。
我终于可以使用此命令访问服务 curl <manager/worker ip>:5000/v2/_catalog
我有一个 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 服务网络的更多详细信息,请参阅 Manage swarm service networks。
示例:运行 10 节点集群上的三任务 Nginx 服务 想象一下,你有一个 10 节点的集群,你部署了一个 Nginx 服务 运行在一个 10 节点的集群上执行三个任务:
$ docker service create --name my_web \
--replicas 3 \
--publish published=8080,target=80 \
nginx
最多三个节点上的三个任务 运行。您不需要知道哪些节点正在 运行 执行任务;连接到 10 个节点中的任何一个上的端口 8080 会将您连接到三个 nginx 任务之一。您可以使用 curl 对此进行测试。以下示例假定 localhost 是 swarm 节点之一。如果不是这种情况,或者本地主机未解析为主机上的 IP 地址,请替换为主机的 IP 地址或可解析的主机名。
HTML 输出是 t运行 满足:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...truncated...
</html>
后续连接可能会路由到同一个群节点或不同的群节点。
我终于可以使用此命令访问服务 curl <manager/worker ip>:5000/v2/_catalog