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

lan*_*gio 15 nginx docker 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: host not found in upstream "web:8000" in /etc/nginx/conf.d/nginx.conf:2 nginx: [emerg] host not found在 /etc/nginx/conf.d/nginx.conf:2 中的上游“web:8000”中

我找到了一个答案,只要您在docker-compose.yml文件中使用与服务下相同的名称,nginx 就会找到该变量。但是,这对我来说似乎没有帮助。

不同容器之间的这种通信是如何工作的?“网络”变量在哪里

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:
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gam*_*rah 9

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

upstream docker-web {
    server web:8000;
}
Run Code Online (Sandbox Code Playgroud)

对于这个新的:

upstream docker-web {
    server web:80;
}
Run Code Online (Sandbox Code Playgroud)

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

假设你有 8000:443,你必须在 Nginx 中创建带有“server web:443”的配置来监听 443 端口号。愿这有帮助。


lan*_*gio 5

我想出了如何解决这个问题。得到了一些帮助来修复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:
Run Code Online (Sandbox Code Playgroud)

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

upstream docker-web {
    server web:8000;
}
Run Code Online (Sandbox Code Playgroud)

对此:

upstream docker-web {
    server web;
}
Run Code Online (Sandbox Code Playgroud)


Mon*_*ina 5

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

    ports:
  - "8000:80"
Run Code Online (Sandbox Code Playgroud)

意味着在容器内部我可以通过端口 80 访问,但在主机中我可以通过 8000 访问。这是关于在 docker-compose 中链接两个服务的文档

所以如果你想在代理 nginx 中访问网络,不要使用 8000,而是使用:

upstream docker-web {
server web:80;
  }
Run Code Online (Sandbox Code Playgroud)

相反,这应该有效:)

或(两者相同)

 upstream docker-web {
    server web;
      }
Run Code Online (Sandbox Code Playgroud)