Docker 服务公开暴露,但仅将端口暴露给本地主机

2024-06-25

我创建了一项服务,并将其公开为仅在我的 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 中的名称发现包使用它(同一网络上的另一个容器/服务将能够通过mongoDNS 名称)。
  • 如果您想在主机中发布而不是在ingress(所以不是 swarm public,只是在它正在运行的主机上,与没有 swarm 模式的方式相同),您需要使用端口扩展语法.
ports:
  - mode: host
    target: 80
    published: 9005

所以,原因是 Swarm 的入口网络,它使每个端口都公开可用。使用扩展语法的解决方法不绑定到环回接口,但是对于主机来说0.0.0.0接口,与通过入口网络向外部暴露的端口相比,这仍然是一个改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 服务公开暴露,但仅将端口暴露给本地主机 的相关文章

随机推荐