如何禁用对docker群中的覆盖networking的外部访问

我正在尝试build立一个拥有以下服务的群组:

  • nginx作为反向代理(主要是为了处理虚拟主机和SSL,虽然这不在nginx.conf中)。
  • 一个golangnetworking应用程序。
  • rediscaching。
  • postgresql存储。

这导致一个docker构成文件类似于:

version: '3' services: proxy: image: nginx:1.13.5-alpine ports: - "80:80" deploy: placement: constraints: [node.role == manager] depends_on: - api volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf networks: - webnet api: image: user/webapp:latest deploy: replicas: 4 ports: - "8000:8000" depends_on: - postgres - redis networks: - webnet postgres: image: postgres:9.6.5-alpine ports: - "5432:5432" deploy: placement: constraints: [node.role == manager] networks: - webnet redis: image: redis:4.0.2-alpine ports: - "6379:6379" deploy: placement: constraints: [node.role == manager] command: redis-server --appendonly yes networks: - webnet networks: webnet: 

我使用的nginxconfiguration文件是:

 upstream api { server api:8000; } server { listen 80; location / { proxy_pass http://api; } } 

这一切正常。 我可以从另一台机器使用curl和nginx服务代理连接到相应的webapp服务。

问题是,我也可以从外部机器连接到redis,api和postgres服务。

我想要的只是使从外部接口访问的代理服务。

我想确保redis,api和postgres服务只能通过swarm访问。 (或者只能在主机节点的本地networking上访问,在这种情况下,主机是CentOS 7设置为群集pipe理器)。

我试图创build一个名为backend的覆盖networking,将internal设置为true ,而不是使用webnet。 像这样的东西:

 docker network create -d overlay --internal backend 

backendnetworking随后用于docker-compose.yml文件,而不是用于redis,postgres和api服务的webnet。 这似乎没有工作。 所有的服务在外部IP上仍然可用。

我可以通过以下方法解决此问题:

  • 阻止我不想公开的服务的端口。
  • 这样做,并在主机上运行nginx作为代理(而不是一个容器)。

虽然上面的工作,我真的更喜欢所有这些逻辑强制在docker撰写级别,而不是依靠防火墙或外部进程。

如果您不想从外部访问端口,则不需要发布这些端口。 容器总是可以通过普通的dockernetworking将容器与容器进行对话,而无需公布端口。

 version: '3' services: proxy: image: nginx:1.13.5-alpine ports: - "80:80" deploy: placement: constraints: [node.role == manager] depends_on: - api volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf networks: - webnet api: image: user/webapp:latest deploy: replicas: 4 depends_on: - postgres - redis networks: - webnet postgres: image: postgres:9.6.5-alpine deploy: placement: constraints: [node.role == manager] networks: - webnet redis: image: redis:4.0.2-alpine deploy: placement: constraints: [node.role == manager] command: redis-server --appendonly yes networks: - webnet networks: webnet: