如何禁用对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
backend
networking随后用于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:
- 使用nginx-proxy容器(如前端服务器)访问同一主机上的多个容器时出现错误503
- 独angular兽服务器与Galera群集之间的反向代理
- 如果我在Docker容器中运行Node.js,是否需要反向代理?
- Docker与nginx反向代理到golang服务器的问题
- traefik反向代理与docker后端 – 在traefik的configuration文件configuration前端规则,而不是通过容器标签
- docker自定义networking连接之间拒绝
- 503服务暂时不可用gitlab docker和nginx-proxy docker
- Nginx作为HTTPS反向代理的多个子域名?
- Traefik(+ Docker)path设置为根和子文件夹分派