我创建了一项服务,并将其公开为仅在我的 docker swarm 节点之一的本地主机上运行,但我可以很容易地公开访问该服务。
我已经删除并重新部署了 docker 堆栈,但仍然存在同样的问题。
这是我用来在堆栈中部署服务的 docker-compose.yml
version: "3"
networks:
api-net:
ipam:
config:
- subnet: 10.0.10.0/24
services:
health-api:
image: myprivateregistry:5000/healthapi:qa
ports:
- "127.0.0.1:9010:9010"
networks:
- api-net
depends_on:
- config-server
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
我没有添加它所依赖的服务,因为我认为这不是问题。
很少有人说 docker swarm 模式不支持它。那么这种情况下的解决方案是什么。
Quoting https://github.com/moby/moby/issues/32299#issuecomment-290978794 https://github.com/moby/moby/issues/32299#issuecomment-290978794:
在 Swarm 模式下,如果您发布某些内容(用于堆栈部署的端口),它将发布在入口网络上,因此它是公共的。有几种方法可以解决这个问题,但要注意这一点,因为我们至少应该在使用具有此表示法的端口(即主机:端口:端口)进行堆栈部署时警告人们这一点。
要解决这个问题,有几种方法:
- 首先,你应该发布
mongo
仅当您想要时才使用端口public,否则,可以通过 docker 中的名称发现包使用它(同一网络上的另一个容器/服务将能够通过mongo
DNS 名称)。
- 如果您想在主机中发布而不是在
ingress
(所以不是 swarm public,只是在它正在运行的主机上,与没有 swarm 模式的方式相同),您需要使用端口扩展语法.
ports:
- mode: host
target: 80
published: 9005
所以,原因是 Swarm 的入口网络,它使每个端口都公开可用。使用扩展语法的解决方法不绑定到环回接口,但是对于主机来说0.0.0.0
接口,与通过入口网络向外部暴露的端口相比,这仍然是一个改进。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)