【问题标题】:Docker service exposed publicly though made to expose ports to localhost onlyDocker 服务公开公开,但仅将端口公开给 localhost
【发布时间】:2018-05-31 10:16:55
【问题描述】:

我创建了一项服务并将其公开为仅在我的一个 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 模式下不受支持。比那种情况下的解决方案是什么。

【问题讨论】:

  • 我在使用 Swarm 模式时遇到了完全相同的问题。
  • edit:@gesellix 的回答是正确的,出于某种原因,最初它似乎只绑定到 localhost,但不幸的是它实际上在所有主机接口上都可用。
  • @Dmitri 在集群模式下不支持。

标签: docker docker-compose docker-swarm


【解决方案1】:

引用https://github.com/moby/moby/issues/32299#issuecomment-290978794:

在 swarm 模式下,如果你发布一些东西(用于堆栈部署的端口),它会在入口网络上发布,因此它是公开的。有几种方法可以绕过,但在上面加上种类/错误,因为我们至少应该警告人们在使用具有此表示法的端口(即主机:端口:端口)进行堆栈部署时注意这一点。

要解决这个问题,有几种方法:

  • 首先,您应该仅在您希望它是 public 的情况下发布mongo 端口,否则,它可以通过 docker 中的名称发现包获得(同一网络上的另一个容器/服务将可以通过mongo dns 名称访问它。
  • 如果你想在主机上发布它而不是ingress(所以不是swarm public,只是在它运行的主机上,和没有swarm模式一样),你需要使用ports扩展语法

ports:
  - mode: host
    target: 80
    published: 9005

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多