Docker Network Nginx Resolver
我试图摆脱配置中已弃用的Docker链接。 当我重新创建容器时,剩下的就是摆脱那些Bad Gateway nginx反向代理错误。
注意:我正在桥接模式下使用Docker网络。 (docker network create nettest)
我在nginx中使用以下配置代码段:
1 2 3 4
| location / {
resolver 127.0.0.1 valid=30s;
set $backend"http://confluence:8090";
proxy_pass $backend; |
我在Docker网络上以名称nettest启动了一个主机名为confluence的容器。
然后,我在网络nettest上启动了nginx容器。
我可以从Nginx容器内ping confluence
confluence列在Nginx容器的/etc/hosts文件中
nginx日志说send() failed (111: Connection refused) while resolving, resolver: 127.0.0.1:53
我尝试了/etc/resol.conf中的docker网络默认dns解析器127.0.0.11
nginx日志说confluence could not be resolved (3: Host not found)
有人知道如何使用Docker Networks配置nginx解析器,或者如何强制Nginx正确解析Docker网络主机名的替代方法?
-
好像没有网络驱动程序就不会以任何方式解决。 原因是Nginx需要解析器的IP,并且无法自动链接到任何Docker管理的DNS解析器。
首先,您应该在127.0.0.11使用Docker嵌入式DNS服务器。
您的问题可能是由以下原因之一引起的:
nginx尝试将IPv6(AAAA记录)用于DNS查询。
有关解决方案,请参见https://stackoverflow.com/a/35516395/1529493。
基本上像这样:
1 2 3
| http {
resolver 127.0.0.11 ipv6=off;
} |
Docker 1.11可能不再是这个问题:
Fix to not forward docker domain IPv6 queries to external servers
(#21396)
请注意不要意外覆盖resolver配置指令。就我而言,我位于Mozilla的SSL配置生成器的server块resolver 8.8.8.8 8.8.4.4;中,该代码覆盖了http块中的resolver 127.0.0.11;。那让我挠挠了很久……
-
硬编码Docker DNS解析器(127.0.0.11)的IP地址不应该成为问题,因为它不会更改。请注意,Docker DNS解析器仅适用于用户定义的网络(docker network create ...)。参考:github.com/docker/docker/issues/22652
-
有关先前评论的更多官方参考:docs.docker.com/engine/userguide/networking/#/
-
在Kubernetes中运行Nginx时必须添加ipv6=off
-
我如何在Nginx解析的容器内部进行检查?
-
@Fazy为什么需要执行这种检查?
-
我收到类似6#6: send() failed (111: Connection refused) while resolving, resolver: 127.0.0.11:53的错误,我尝试同时使用resolver 127.0.0.11;和resolver 127.0.0.11 ipv6=off;都无济于事。还有其他人知道吗?
-
@Tony不要使用硬编码的DNS解析器地址。并且请确保您使用的是用户定义的网络。默认网络的工作方式有所不同。
-
实际上,@ MarcoRoy是正确的。该文档保证用户定义网络中嵌入式DNS解析器的地址始终为127.0.0.11-该文档已移至docs.docker.com/v17.09/engine/userguide/networking/
-
您还应该在答案中添加所需的内容,以在nginx容器和后端服务之间建立链接。在我的docker compose上,我没有添加depends_on: - rs-gateway,并且仅在添加它时才开始工作。您也可以说127.0.0.11 IP来自etcresolv.conf,并且可能会因Docker运行程序而有所不同。
-
嘿,一年后又是我!您的配置不利于docker swarm:看看stackoverflow.com/a/46664433/2294168(需要设置valid=10s并使用set定义动态变量并绕过DNS缓存)
也许您应该检查容器的/etc/resolv.conf
它显示了容器的正确DNS配置,然后使用该DNS服务器IP作为解析程序。
127.0.0.11在Rancher中不起作用
-
哦,很抱歉,仅作其他建议。因为我的朋友抱怨说这行不通,所以也许我们会仔细阅读答案
-
@ L.Guthardt,请不要写这样的评论。他们没有帮助人们,而这个答案却有帮助。 @exiaohao,看来当Weave地址空间受CIDR限制时,Docker使用不同的DNS(而不是127.0.0.11)。将解析器设置为容器etcresolv.conf中记录的名称服务器IP很有帮助。谢谢。
我通过以下方式解决了这个问题:
1
| docker run --rm -d --network host --name"my_domain" nginx |
https://docs.docker.com/network/network-tutorial-host/
在某些情况下,我遇到此错误,将resolver_timeout 1s;添加到Nginx配置中可以解决此问题。大多数时候,我没有resolver条目。
编辑:什么也可以用于容器,在其中我可以显式定义名称服务器:resolver DNS-IP valid=1s;
我们在Windows上使用docker容器尝试在172.0.0.11上使用docker内部解析器查找host.docker.internal来实现这一点。除host.docker.internal外,所有查询都可以正确解析。解决方法是将ipv6 = off标志添加到nginx.conf中的解析器行。
您需要像dnsmasq这样的本地dns服务器才能使用127.0.0.1进行解析。尝试使用apk add --update dnsmasq安装它,如果使用的是高山(nginx:alpine)变体,请进行设置。