Networking Docker网络Nginx解析器

Networking Docker网络Nginx解析器,networking,nginx,docker,Networking,Nginx,Docker,我试图在我的配置中删除不推荐使用的Docker链接。当我重新创建一个容器时,剩下的就是摆脱了那些坏网关nginx反向代理错误 注意:我在桥接模式下使用Docker网络。(docker网络创建nettest) 我在nginx中使用以下配置片段: location / { resolver 127.0.0.1 valid=30s; set $backend "http://confluence:8090"; proxy_pass $backend; 我在Dock

我试图在我的配置中删除不推荐使用的Docker链接。当我重新创建一个容器时,剩下的就是摆脱了那些
坏网关
nginx反向代理错误

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

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

location / {
      resolver 127.0.0.1 valid=30s;
      set $backend "http://confluence:8090";
      proxy_pass $backend;
  • 我在Docker网络上用name
    nettest
    启动了一个主机名为
    confluence
    的容器
  • 然后我在网络
    nettest
    上启动了nginx容器
  • 我可以从nginx容器内部ping
    converge
  • confluence
    列在nginx容器的
    /etc/hosts
    文件中
  • nginx日志显示解析时
    send()失败(111:连接被拒绝),解析程序:127.0.0.1:53
  • 我从
    /etc/resol.conf
  • nginx日志显示无法解决融合问题(3:找不到主机)

  • 有人知道如何使用Docker Networks配置nginx解析器,或者知道如何强制nginx正确解析Docker网络主机名的替代方法吗?

    您需要像
    dnsmasq
    这样的本地dns服务器才能使用127.0.0.1解析。如果您使用的是alpine(
    nginx:alpine
    )变体,请尝试使用apk add——更新dnsmasq来安装它。

    首先,您应该使用位于
    127.0.0.11
    的Docker嵌入式DNS服务器

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

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

    有关解决方案,请参阅

    基本上是这样的:

    http {
        resolver 127.0.0.11 ipv6=off;
    }
    
    这可能不再是Docker 1.11的问题:

    修复了不将docker域IPv6查询转发到外部服务器的问题 ()

  • 注意不要意外覆盖
    解析器
    配置指令。在我的例子中,我在
    服务器
    解析器8.8.8.8.4.4
    from,它覆盖了
    resolver 127.0.0.11
    块中的code>。这让我挠头很久了


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

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


    127.0.0.11
    在Rancher中不起作用

    我们使用windows上的docker容器尝试使用172.0.0.11上的docker internal resolver查找host.docker.internal。除host.docker.internal外,所有查询都将正确解析。修复方法是将ipv6=off标志添加到nginx.conf中的解析器行。

    在我出现此错误的一些情况下,添加
    解析器超时1s到Nginx配置解决了这个问题。大多数情况下,我没有
    解析器
    条目


    编辑:对于可以显式定义名称服务器的容器,什么也起作用:
    resolver DNS-IP valid=1s

    我用以下方法解决了这个问题:

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

    我在运行带有角度前端的“节点: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
    

    如果没有网络驱动程序,这看起来不会以任何方式得到解决。原因是Nginx需要解析程序的ip,这无法自动链接到任何Docker管理的DNS解析程序。硬编码Docker DNS解析程序的ip地址(
    127.0.0.11
    )不应成为问题,因为它不会更改。请注意,Docker DNS解析器仅适用于用户定义的网络(
    Docker network create…
    )。参考:前面评论的更多官方参考:在KubernetShow中运行nginx时,我必须添加
    ipv6=off
    ,我是否在容器内检查nginx是否解决了此问题?@Fazy为什么需要执行此检查?哦,抱歉,只是为了补充建议。因为我的朋友抱怨它不起作用,也许我们应该多读一些答案carefully@L.Guthardt,请不要写这样的评论。他们不帮助人们,而这个答案确实如此@似乎,当编织地址空间受CIDR约束时,Docker使用不同的DNS(而不是127.0.0.11)。将解析器设置为容器
    /etc/resolv.conf
    中注明的名称服务器IP有帮助。谢谢。你是说
    127.0.0.11
    ,而不是
    172.0.0.11
    ?如果nginx能够解析“kube dns.kube system”,那么我不明白为什么需要在配置中存在这个问题。然而,这是在k8s中唯一对我有用的东西。我认为k8s不再使用docker,因此127.0.0.11技巧不再有效。@Phil,当您部署到kubernetes/etc/resolv.conf时,其名称服务器已更改为kube dns IP。这就是为什么它可以解析“kube dns.kube系统”。“127.0.0.11”是我用来在本地运行它的。关于docker和k8s支持,我仍然在1.18:-)是的,我明白了,但是解析解析器感觉有点混乱。如果nginx已经可以使用OS DNS/resolv.conf解析解析程序名,为什么还需要告诉它如何解析其他名称,例如proxy_pass中的名称。我现在明白你的意思了。真的。不幸的是,我不能回答这个问题,但我要说的是,这对我来说也是可行的:-(
    resolver kube-dns.kube-system valid=10s;