docker compose与其他图像之间的通信

docker compose与其他图像之间的通信,docker,nginx,docker-compose,docker-networking,Docker,Nginx,Docker Compose,Docker Networking,我有这样的架构: -1个docker组件在主机端口80上运行nginx -具有2项服务的应用程序:一个节点和一个mongodb docker编写文件: version: '2' services: backend: build: ./back-end/ container_name: "app-back-end" volumes: - ./back-end/:/usr/src/dance-app-back - /usr/src/app-bac

我有这样的架构: -1个docker组件在主机端口80上运行nginx -具有2项服务的应用程序:一个节点和一个mongodb

docker编写文件:

version: '2'

services:
  backend:
    build: ./back-end/
    container_name: "app-back-end"
    volumes:
      - ./back-end/:/usr/src/dance-app-back
      - /usr/src/app-back/node_modules
    ports:
      - "3000:3050"
    links:
      - mongodb

  mongodb:
    image: mongo:3.2.15
    ports:
      - "3100:27017"
    volumes:
      - ./data/mongodb:/data/db
  nginx:
    restart: always
    image: nginx:1.13.1
    ports:
      - "80:80"
    depends_on:
      - backend
    links:
      - backend:backend
nginx配置文件

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location /back_1 {
        #proxy_pass http://172.17.0.2:5050/;
        proxy_pass http://0.0.0.0:5050/;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
nginx容器似乎无法到达主机上的端口3000。
我做错了什么?

如果主机上有端口3000,并且希望将其映射到容器端口,则需要在docker compose文件中执行该操作

更改:

backend:
    build: ./back-end/
    container_name: "app-back-end"
    volumes:
      - ./back-end/:/usr/src/dance-app-back
      - /usr/src/app-back/node_modules
    ports:
      - "3000:3000"
    links:
      - mongodb
然后,您可以将nginx链接到要代理传递到的容器

添加到您的撰写文件:

version: '2'

services:
  backend:
    build: ./back-end/
    container_name: "app-back-end"
    volumes:
      - ./back-end/:/usr/src/dance-app-back
      - /usr/src/app-back/node_modules
    ports:
      - "3000:3050"
    links:
      - mongodb

  mongodb:
    image: mongo:3.2.15
    ports:
      - "3100:27017"
    volumes:
      - ./data/mongodb:/data/db
  nginx:
    restart: always
    image: nginx:1.13.1
    ports:
      - "80:80"
    depends_on:
      - backend
    links:
      - backend:backend
然后在您的nginx文件中,提到您希望使用打开的容器端口代理的应用程序容器的名称

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location /back_1 {
        proxy_pass http://backend:3000/;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

您可以链接容器名称和nginx配置,而不是nginx中容器的IP,docker将为您解析这些IP

通过直接连接主机上的端口3000,您是否能够访问应用程序服务器?您的nginx配置在端口5050上有一个代理传递,它不应该是3000吗?没有将nginx集成到与你的应用程序相同的撰写文件中有什么具体原因吗?我将nginx放在一个单独的dockerfile中,这样当我有一个新网站要为你回复时,我就可以更新nginx conf文件了!我一会儿就试试。但只有一个问题:通过将nginx与其他服务放在compose文件中,我将不得不在添加新网站时重新启动整个设置,不是吗?我将nginx放在一个单独的dockerfile中,这样当我有一个新网站要服务时,我就可以更新nginx conf文件。如果您更新nginx配置,则只会重新创建nginx服务/容器。其余集装箱/服务将不会产生影响。无论您是在一台主机上还是在多台主机上部署,都可以将所有内容集成到一个组合文件中。@viveky4d4v明白了!再次感谢。更深入地说,我的问题可能来自这样一个事实:我没有在docker compose文件中将我的nginx容器的网络指定为外部网络。对吗?如果您在单个主机上,则不需要外部网络。在compose文件中定义的所有服务都可以通过它们的服务名相互访问。是的,我理解这一点。但是,如果一个服务在它自己的docker文件中单独运行,而我们需要从在docker文件中运行的其他服务访问它,该怎么办?