关于网络:Docker Network Nginx解析器

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网络主机名的替代方法?


    首先,您应该在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配置生成器的serverresolver 8.8.8.8 8.8.4.4;中,该代码覆盖了http块中的resolver 127.0.0.11;。那让我挠挠了很久……


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

    它显示了容器的正确DNS配置,然后使用该DNS服务器IP作为解析程序。

    127.0.0.11在Rancher中不起作用


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

    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)变体,请进行设置。