Docker服务公开,但使其仅向本地主机公开端口

Docker服务公开,但使其仅向本地主机公开端口,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我已经创建了一个服务,并将其公开为仅在docker swarm节点中的本地主机上运行,但我太容易公开访问该服务 我已经删除并重新部署了docker堆栈,但仍然存在相同的问题 这是我的docker-compose.yml,我曾在堆栈中部署该服务 我没有添加它所依赖的服务,因为我认为这不是问题所在 很少有人说它在docker swarm模式下不受支持。而不是那种情况下的解决方案 引述: 在swarm模式下,如果发布某个内容(用于堆栈部署的端口),它将发布在入口网络上,因此它是公共的。有几种方法可以解

我已经创建了一个服务,并将其公开为仅在docker swarm节点中的本地主机上运行,但我太容易公开访问该服务

我已经删除并重新部署了docker堆栈,但仍然存在相同的问题

这是我的docker-compose.yml,我曾在堆栈中部署该服务

我没有添加它所依赖的服务,因为我认为这不是问题所在

很少有人说它在docker swarm模式下不受支持。而不是那种情况下的解决方案

引述:

在swarm模式下,如果发布某个内容(用于堆栈部署的端口),它将发布在入口网络上,因此它是公共的。有几种方法可以解决这个问题,但要考虑种类/错误,因为在使用具有此符号的端口(即主机:端口:端口)进行堆栈部署时,我们至少应该警告人们这一点

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

  • 首先,您应该仅在希望它是公共的情况下发布
    mongo
    端口,否则,它可以通过docker中的名称发现捆绑包获得(同一网络上的另一个容器/服务将能够通过
    mongo
    dns名称访问它)
  • 如果要在主机中而不是在
    入口
    中发布它(因此不是swarm public,只是在它运行的主机上,与不使用swarm模式的方式相同),则需要使用端口扩展语法
ports:
  - mode: host
    target: 80
    published: 9005


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

为了在swarm模式下访问,您需要将该端口暴露到容器外部的同一端口或其他端口

大概是这样的:

ports:
    - "80:80"
    - "443:443"

我对Swarm模式也有同样的问题。编辑:@gesellix的回答是正确的,出于某种原因,起初它似乎只绑定到本地主机,但不幸的是,它实际上在所有主机接口上都可用。@Dmitri Swarm模式不支持它。类似于
ports:
    - "80:80"
    - "443:443"