nginx proxy_传递到链接的docker容器

nginx proxy_传递到链接的docker容器,nginx,docker,reverse-proxy,Nginx,Docker,Reverse Proxy,我有两个带nginx的docker容器。container1链接到container2。Docker然后向/etc/hosts添加一个条目,我在nginx配置中输入了该条目,如下所示: server { location ~ ^/some_url/(.*)$ { proxy_pass http://container1/$1; } } 我可以从container2 ping container1,但nginx无法解决此问题: *1未定义解析程序来解析容器1 如何

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

server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://container1/$1;
    }
}
我可以从container2 ping container1,但nginx无法解决此问题:

*1未定义解析程序来解析容器1


如何代理将请求传递给另一个docker容器?

您应该看看关于使用/etc/hosts作为解析程序的回答:

基本上,您的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;
    }
}

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

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

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

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

cat /etc/resolv.conf
server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.11;
        proxy_pass http://container1/$1;
    } }
应该是:

nameserver 127.0.0.11
将此IP用作解析程序:

cat /etc/resolv.conf
server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.11;
        proxy_pass http://container1/$1;
    } }

你能分享你的主机文件吗?你是如何把这两个容器连接起来的?(链接的名称是什么?)还有一个问题:如果您
rm
d其中一个容器并稍后重新启动它,IP将发生更改(主机未更新)。我刚刚尝试了与您类似的配置,它对我使用
nginx:1.7.9
运行良好。你能在container2和curl container1开始bash吗?您使用的container1和container2的配置都不相同,是吗?@MykolaGurov我可以从container2 ping和curl以及container1以外的其他配置。我的问题是,nginx似乎无法解决它。我没有使用相同的配置,没有(如果你指的是nginx配置的话)。这是我实际上已经尝试过的,但是因为dnsmasq没有在没有错误的情况下启动,所以我放弃了。也许太快了。我会再试一次,让你知道。我再试了一次,只是把dnsmasq添加到我的入口点。如果您在虚拟机中运行容器,请确保以root用户身份运行dnsmasq,否则它将无法正常工作。当您不想处理任何外部依赖项时,最好的答案是。此解决方案的问题是,
container1
必须先启动并运行,然后才能启动nginx容器,否则,它不会开始编写等待后端启动的脚本。类似的方法应该可以工作:
bash-c“while!curl-s container1:8080>/dev/null;do echo等待container1;sleep 3;done;start\u nginx.sh”
where
start\u nginx.sh
实际上启动了nginx服务。@Marc AlexandreBérubé不应该是个问题-如果您使用
--link
,这无论如何都是一个要求。只有真正干净和安全的解决方案。荣誉嗯,也许硬编码的IP 127.0.0.11会带来一些问题,我想是的。理想的方法是为名称服务器IP解析
etc/resolv.conf
。在用户定义的网络中硬编码IP地址不会有问题。为什么Nginx不解析resolv.conf btw?看起来是这样,但不确定为什么它在docker的情况下会特别失败。