Docker:proxy_pass到另一个容器 - 在上游找不到nginx:host

时间:2017-08-16 15:40:39

标签: docker nginx docker-compose

(我知道其他人之前已经问过这个问题,但是我无法使用其他帖子中提出的解决方案来解决问题,所以我想我会尝试发布我的配置文件并查看是否有人可以提供帮助。)

我想为nginx创建一个容器,并使用proxy_pass通过正在运行的Web应用程序将请求传递给容器。我无法弄清楚如何在两个容器之间进行通信。当我尝试运行docker stack deploy -c docker-compose.yml somename时,只启动Web容器。 nginx容器无法启动,并且陷入了尝试重新启动的循环中。这是我得到的日志消息:

  

2017/08/16 14:56:10 [emerg] 1#1:主机未在上游找到" web:8000"   在/etc/nginx/conf.d/nginx.conf:2 nginx:找不到[emerg]主机   上游" web:8000"在/etc/nginx/conf.d/nginx.conf:2

我找到了答案,只要您使用与docker-compose.yml文件中的服务相同的名称,nginx就会找到该变量。然而,在我的情况下,这似乎并没有帮助。

不同容器之间的通信如何工作? ' web'在哪里?变量

我见过的大多数示例都在version: "2"文件中使用docker-compose.yml,这是否会产生影响?

我的docker-compose.yml:

version: "3"
services:
  web:
    image: user/repo:web
    deploy:
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "8000:80"
    networks:
      - webnet

  nginx:
    image: user/repo:nginx
    ports:
      - 80:80
    links:
      - web:web
    depends_on:
      - web

networks:
  webnet:

Nginx配置:

upstream docker-web {
    server web:8000;
}


server {
    listen 80;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
         proxy_pass http://docker-web;

         proxy_set_header   Host $host;
         proxy_set_header   X-Real-IP $remote_addr;
         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header   X-Forwarded-Host $server_name;
    }
}

4 个答案:

答案 0 :(得分:2)

我想出了如何解决这个问题。得到一些帮助来修复docker-compose.yml,所以它看起来像这样:

<强>搬运工-撰写-YML:

version: "3"
services:
  web:
    image: user/repo:web
    deploy:
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "8000:80"
    networks:
        main:
            aliases:
                - web


  nginx:
    image: user/repo:nginx
    ports:
      - 80:80
    links:
      - web:web
    depends_on:
      - web
    networks:
        main:
            aliases:
                - nginx
networks:
  main:

此后nginx容器实际运行,但它仍然无法连接到Web容器。发现我能够使用curl webcurl web -p 8000从nginx容器内部从Web获取页面。然后我改变了nginx.conf中的上游

upstream docker-web {
    server web:8000;
}

到此:

upstream docker-web {
    server web;
}

答案 1 :(得分:2)

很简单。只需更改旧配置:

upstream docker-web {
    server web:8000;
}

到这个新的:

upstream docker-web {
    server web:80;
}

原因是,容器之间无法与已发布的端口进行通信。它只能与目标端口通信。 8000:80(发布的端口为8000,目标端口为80)。

假设您拥有8000:443,则必须在Nginx内使用“ server web:443”创建配置以侦听443端口号。希望有帮助。

答案 2 :(得分:1)

您好,问题在于链接web:web的端口时,您需要指定容器运行示例服务的端口

    ports:
  - "8000:80"

表示可以在端口80上访问容器内的内容,但在主机上可以通过8000访问。 这是关于在docker-compose中链接两个服务的doc

因此,如果要在代理nginx中访问网站,请不要使用8000 但使用:

upstream docker-web {
server web:80;
  }

相反,这应该可以工作:)

或(两者都相同)

 upstream docker-web {
    server web;
      }

答案 3 :(得分:0)

您可以通过编辑 / etc / hosts 文件并为您的网络主机添加正确的条目来实现这一目标

1.1.1.1 web

显然,您必须将1.1.1.1替换为Web服务器的真实IP地址(我认为是私有IP地址)。保存文件,然后重试。另一种解决方法是在配置中替换:

upstream docker-web {
    server web:8000;
}

upstream docker-web {
    server web-ip-address:8000;
}

如果您要参加第二场比赛,请不要忘记重启/重新加载nginx!