nginx proxy_pass到链接的docker容器

Tim*_*win 24 reverse-proxy nginx docker

我有两个带nginx的docker容器.container1链接到container2.Docker然后在/ etc/hosts中添加一个条目,我将其输入到nginx配置中,如下所示:

server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://container1/$1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以从container2 ping 容器1,但是nginx无法解析它:

*1没有定义解析容器1的解析器

我怎样才能将请求委托给另一个docker容器?

Bru*_*ger 35

直接使用上游块而不是容器名称

upstream backend {
    server container1;
}
server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://backend/$1;
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该允许正常的名称解析,提供一种方法来轻松使用与nginx的docker链接.

  • 我对这个解决方案的问题是`container1`必须启动并运行才能启动你的nginx容器,否则它将无法启动 (6认同)

Tho*_*aux 34

您可以使用嵌入式Docker DNS服务,如果启用,请检查您的容器解析器:

cat /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

应该:

nameserver 127.0.0.11
Run Code Online (Sandbox Code Playgroud)

使用此IP作为解析器:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.11;
        proxy_pass http://container1/$1;
    } }
Run Code Online (Sandbox Code Playgroud)

  • 嗯,也许硬编码的 IP 127.0.0.11 可能会带来一些问题 (3认同)
  • 我刚遇到这个:http://stackoverflow.com/questions/35744650/docker-network-nginx-resolver#comment68472082_37656784。在用户定义的网络中硬编码 IP 地址不会有问题。 (2认同)
  • 为什么 Nginx 不解析 resolv.conf 顺便说一句? (2认同)

Mic*_*ael 7

你应该看看这个关于使用/ etc/hosts作为你的解析器的答案:使用/ etc/hosts作为解析器进行url重写

基本上,您的dns或解析器在查找期间不使用/ etc/hosts来解析名称,但您可以通过安装dnsmasq和使用127.0.0.1解析器来解决此问题.您可以直接在nginx配置中添加127.0.0.1作为解析器:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.1;
        proxy_pass http://container1/$1;
    }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

12914 次

最近记录:

8 年,11 月 前