如何在泊坞窗群禁用覆盖网络外部访问

问题描述:

我试图建立一个具有以下服务群:如何在泊坞窗群禁用覆盖网络外部访问

  • nginx的反向代理(主要是处理虚拟主机和SSL,尽管这不在nginx.conf中)。
  • golang web应用程序。
  • redis用于缓存。
  • postgresql存储。

这导致类似于码头工人,撰写文件:我使用

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: 

nginx的配置文件是:

upstream api { 
    server api:8000; 
} 

server { 
    listen 80; 

    location/{ 
     proxy_pass http://api; 
    } 
} 

这是所有工作。我可以使用curl和nginx服务代理从另一台机器连接到相应的webapp服务。

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

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

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

我试图创建一个名为backend的覆盖网络,将internal设置为true,而不是使用webnet。事情是这样的:

docker network create -d overlay --internal backend 

backend网络,然后在泊坞窗,compose.yml文件,而不是webnet对Redis的,Postgres的和API服务使用。这似乎没有工作。所有服务在外部IP上仍然可用。

我可以解决此问题是:

  • 阻断我不想暴露服务的端口。
  • 完成上述操作,并在主机上运行nginx作为代理(而不是容器)。

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

如果您不希望外部访问端口,则不需要发布这些端口。容器始终可以通过普通的码头网络将容器与容器对话,而无需公布端口。

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: