【问题标题】:Communication between docker-compose and other imagesdocker-compose 与其他镜像的通信
【发布时间】:2017-09-06 16:15:42
【问题描述】:

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

docker-compose 文件:

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 配置文件

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 来访问您的应用程序服务器?您的 nginx 配置在端口 5050 上有一个代理传递,不应该是 3000 吗?没有将 nginx 集成到与您的应用程序相同的撰写文件中的任何具体原因?
  • 我将 nginx 放在一个单独的 dockerfile 中,这样当我有一个新网站要服务时,我就可以更新 nginx conf 文件

标签: docker nginx docker-compose docker-networking


【解决方案1】:

如果您的主机上有端口 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 链接到你想要代理传递的容器。

添加到您的撰写文件中:

  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。

【讨论】:

  • 感谢您的回复!我一会儿试试。但只有一个问题:通过将 nginx 与其他服务一起放在 compose 文件中,当我添加新网站时,我将不得不重新启动整个设置,不是吗?我将 nginx 放在一个单独的 dockerfile 中,这样当我有一个新网站要服务时,我就可以更新 nginx conf 文件
  • 如果你更新你的 Nginx 配置,只有 nginx 服务/容器会被重新创建。其余的容器/服务将没有影响。无论您是将其部署在一台主机还是多台主机上,将所有内容集成到一个 compose 文件中都是理想的选择。
  • @viveky4d4v 知道了!再次感谢。只是为了更深入地挖掘,我的问题可能来自于我没有在我的 docker-compose 文件中将我的 nginx 容器的网络指定为外部网络。对吗?
  • 如果您在单个主机上,则不需要外部网络。 compose 文件中定义的所有服务都可以通过它们的服务名称相互访问。
  • 是的,我明白这一点。但是,如果一个服务在它自己的 dockerfile 中单独运行,而我们需要从运行在它们的 docker-compose 文件中的其他服务访问它呢?
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多