Docker Compose-用单独的撰写文件连接两个容器,并将一个端口从主机转发到一个容器

时间:2019-05-16 22:12:10

标签: docker docker-compose

我从一个包含我要运行的所有服务的撰写文件开始。为了能够彼此独立地重建和启动它们,我希望每个文件都在自己的撰写文件中。

作为测试设置,我使用两个nginx服务器。一个用于服务器页面,另一个用于代理该页面的Nginx服务器。

如果我只是分割组成文件,则其他nginx服务器将不再可用。为了再次连接它们,我创建了自己的网络“服务”,并将所有容器连接到该网络。结果,代理nginx可以再次找到具有该页面的nginx(在其他情况下,我会收到错误消息,因为其他nginx无法访问)。 可悲的是,端口转发似乎在我的配置中被禁用。如果我注释掉网络定义,则端口映射可以正常工作。

我试图找到的是一种既可以连接两个nginx容器又可以设置从主机到一个容器的端口转发的解决方案。

当我用portainer创建网络(也直接在docker cli上尝试过)时,我将网络定义为外部。

带有页面的nginx的撰写文件是

version: '3'

services:
  nginx2:
    container_name: 'nginx2'
    restart: unless-stopped
    image: nginx:latest
    networks:
      - services
    expose:
      - "80"
    ports:
      - "8092:80"
    volumes:
      - ./conf/default.conf:/etc/nginx/conf.d/default.conf
      - ./conf/index.html:/usr/share/nginx/html/index.html
      - ./data/log:/var/log/nginx

networks:
  services:
    external: true

充当代理的nginx的组成文件是

version: '3'

services:
  nginx1:
    container_name: 'nginx1'
    restart: unless-stopped
    image: nginx:latest
    expose:
      - "80"
    ports:
      - "8091:80"
    networks:
      - services
    volumes:
      - ./conf/default.conf:/etc/nginx/conf.d/default.conf
      - ./conf/index.html:/usr/share/nginx/html/index.html
      - ./data/log:/var/log/nginx

networks:
  services:
    external: true

nginx代理设置为

proxy_pass      http://nginx2;

网络定义是

name: services
scope: local
Driver: ridge
Attachable: true
Internal: true
IPAM Driver: default
IPAM Subnet: 192.168.33.0/20
IPAM Gateway: 192.168.32.1

如果有人能指出我连接两个容器并同时为一个容器进行端口转发的情况,那真是太好了。

1 个答案:

答案 0 :(得分:0)

我知道了。 撰写文件正确。

问题是网络定义错误。 我的神经网络“服务”是通过将参数“内部”设置为“真”来定义的。 这将禁用端口转发。

将网络参数“内部”设置为“假”,一切正常。

这里是网络的完整配置

name: services
scope: local
Driver: ridge
Attachable: true
Internal: false
IPAM Driver: default
IPAM Subnet: 192.168.33.0/20
IPAM Gateway: 192.168.32.1