Nginx在多容器docker compose设置中找不到上游主机,并且在client:3000上也找不到主机

时间:2020-09-29 03:58:33

标签: docker docker-compose dockerfile

这是github仓库:https://github.com/irahulsah/mutlicontainerapp 请访问以获取更多信息,请帮助我修复此错误。

我正在本地使用docker-compose运行一个多docker容器,这些容器是React前端“客户端”,Nodejs应用程序“ api”和位于两者前面的Nginx代理。一段时间以来,我一直在使用docker-compose设置。

version: '3'
services:
  client:
    build:
      dockerfile: Dockerfile.dev
      context: ./client
    volumes:
      - /usr/app/node_modules
      - ./client:/usr/app
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - /usr/app/node_modules
      - ./server:/usr/app
  nginx:
    restart: always
    build:
      dockerfile: Dockerfile.dev
      context: ./nginx
    ports:
      - '8080:80'

我的Nginx设置如下

upstream client {
    server client:3000;
}

upstream api {
    server api:5000;
}

server {
    listen 80;
    server_name _;

    location / {
        if ($http_x_forwarded_proto != 'https') {
            return 301 https://$host$request_uri;
        }
        proxy_pass http://client;
    }

    location /api {
        if ($http_x_forwarded_proto != 'https') {
            return 301 https://$host$request_uri;
        }
        rewrite /api/(.*) /$1 break;
        proxy_pass http://api;
    }
}

最近,当我尝试启动容器时,出现以下错误:

nginx_1   | 2019/08/08 18:11:12 [emerg] 1#1: host not found in upstream "client:3000" in /etc/nginx/conf.d/default.conf:2
nginx_1   | nginx: [emerg] host not found in upstream "client:3000" in /etc/nginx/conf.d/default.conf:2

有人知道为什么nginx无法找到上游吗?

我试图按如下方式添加到nginx设置块的链接:

  nginx:
    restart: always
    build:
      dockerfile: Dockerfile.dev
      context: ./nginx
    links:
      - client:client
      - api:api
    ports:
      - '8080:80'

我也尝试过'depends_on',但是也可以在client:300错误上找到主机,对如何解决此错误的任何想法将不胜感激。

非常感谢您的帮助或指导!

1 个答案:

答案 0 :(得分:1)

我今天有同样的问题。我通过将nginx上游引用的所有容器附加到同一docker虚拟网络中来解决此问题。

此外,请确保明确定义容器名称。如果我没看错,则docker-compose将您的服务名称加上yaml文件名。

  service_one:
    networks:
     - app-network # define the network
      container_name: backend # the "backend" name must be used in the upstream directive in nginx configuration