Docker网络Nginx解析器

时间:2016-03-02 10:33:16

标签: networking nginx docker

我正在尝试摆脱配置中已弃用的Docker链接。当我重新创建容器时,剩下的就是摆脱那些Bad Gateway nginx反向代理错误。

注意:我在桥接模式下使用Docker网络。 (docker network create nettest

我在nginx中使用以下配置代码段:

location / {
      resolver 127.0.0.1 valid=30s;
      set $backend "http://confluence:8090";
      proxy_pass $backend;
  1. 我在Docker网络上创建了一个名为confluence的主机名为nettest的容器。
  2. 然后我在网络nettest上启动了nginx容器。
  3. 我可以从nginx容器
  4. 中ping confluence
  5. confluence列在nginx容器的/etc/hosts文件
  6. nginx日志说`send()失败(111:拒绝连接),解析时,解析器:127.0.0.1:53``
  7. 我尝试了127.0.0.11
  8. 中的docker network默认dns解析器/etc/resol.conf
  9. nginx log说confluence could not be resolved (3: Host not found)
  10. 有人知道如何使用Docker Networks配置nginx解析器,或者如何强制Nginx正确解析Docker网络主机名吗?

8 个答案:

答案 0 :(得分:73)

首先,您应该在127.0.0.11使用Docker嵌入式DNS服务器。

您的问题可能是由以下原因之一引起的:

  1. nginx正在尝试使用IPv6(AAAA记录)进行DNS查询。

    有关解决方案,请参阅https://stackoverflow.com/a/35516395/1529493

    基本上类似于:

    http {
        resolver 127.0.0.11 ipv6=off;
    }
    

    这可能不再是Docker 1.11的问题:

      

    修复不将docker域IPv6查询转发到外部服务器   (#21396

  2. 请注意不要意外覆盖resolver配置指令。就我而言,我来自server resolver 8.8.8.8 8.8.4.4; resolver 127.0.0.11; http,它覆盖了ImageView区块中的SELECT INVOICE_QUANTITY * ISNULL(MANUAL_PRICE,ISNULL(LIST_PRICE,0)) as Revenue 。这让我长时间摸不着头......

答案 1 :(得分:3)

也许你应该检查你的容器/etc/resolv.conf

它显示了您的容器的正确DNS配置,然后将该DNS服务器IP用于解析器。

127.0.0.11在Rancher中不起作用

答案 2 :(得分:2)

我正在使用 Angular 前端运行“node:12.18-alpine”,并在使用 proxy_pass 时遇到了同样的问题。

在本地与它合作:

resolver 127.0.0.11;

就这么简单!只需执行:

$ cat /etc/resolv.conf | grep nameserver

在你的容器中获取这个IP地址。

但是,在部署到 kubernetes (AWS EKS) 时,我遇到了同样的错误:

failed (111: Connection refused) while resolving, resolver: 127.0.0.11:53

解决方案:

第一个解决方案是找出 kube-dns 服务的 IP,如下所示:

$ kubectl get service kube-dns -n kube-system
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
kube-dns   ClusterIP   172.20.0.10   <none>        53/UDP,53/TCP   178d

简单地替换 CLUSTER-IP 的 IP 就像一个魅力。

后来,经过更多的文档挖掘,我发现我可以通过名称来引用服务(这样更优雅和更有弹性):

resolver kube-dns.kube-system valid=10s;

答案 3 :(得分:0)

我们在Windows上的docker容器上尝试使用172.0.0.11的docker内部解析器来查找host.docker.internal。除host.docker.internal外,所有查询都可以正确解析。解决的方法是将ipv6 = off标志添加到nginx.conf中的解析器行。

答案 4 :(得分:0)

在某些情况下,我遇到此错误,将resolver_timeout 1s;添加到Nginx配置中可以解决此问题。大多数情况下,我没有resolver条目。

编辑:对于我可以显式定义名称服务器的容器也有效:resolver DNS-IP valid=1s;

答案 5 :(得分:0)

我通过以下方式解决了这个问题:

docker run --rm -d --network host --name "my_domain" nginx

https://docs.docker.com/network/network-tutorial-host/

答案 6 :(得分:0)

我的问题是 $request_uri 最后。在 uri 末尾添加它并将 127.0.0.1 更改为 127.0.0.11 后解决了我的问题。我希望它能帮助人们不要在这上面花费数小时。

location /products {
            resolver 127.0.0.11;
            proxy_pass http://products:3000$request_uri;
            }

答案 7 :(得分:-1)

您需要像dnsmasq这样的本地DNS服务器才能使用127.0.0.1解析。尝试使用apk add --update dnsmasq进行安装,如果您正在使用高山(nginx:alpine)变种,请进行设置。