Docker 网络 Nginx 解析器

问题描述 投票:0回答:9

我正在尝试删除配置中已弃用的 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. 然后我在网络上启动了 nginx 容器
    nettest
  3. 我可以从 nginx 容器内部 ping
    confluence
  4. confluence
    列在 nginx 容器的
    /etc/hosts
    文件中
  5. nginx 日志显示
    send() failed (111: Connection refused) while resolving, resolver: 127.0.0.1:53
  6. 我尝试了 docker 网络默认 dns 解析器
    127.0.0.11
    来自
    /etc/resol.conf
  7. nginx 日志显示
    confluence could not be resolved (3: Host not found)

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

networking nginx docker
9个回答
170
投票

首先,您应该使用位于

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;
    中使用了 Mozilla 的 SSL 配置生成器,它覆盖了
    resolver 127.0.0.11;
    块中的
    http
    。这让我挠头很久了……


17
投票

也许您应该检查容器的

/etc/resolv.conf

它显示容器的正确 DNS 配置,然后使用该 DNS 服务器 IP 进行解析器。

127.0.0.11
在 Rancher 中不起作用


7
投票

我正在使用 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

简单地将 IP 替换为 CLUSTER-IP,效果非常好。

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

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

5
投票

我的问题是最后的$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;
            }

2
投票

在我遇到此错误的几种情况下,将

resolver_timeout 1s;
添加到 Nginx 配置中解决了该问题。大多数时候我没有
resolver
条目。

编辑:对于我可以显式定义名称服务器的容器也适用:

resolver DNS-IP valid=1s;


1
投票

我们在 Windows 上使用 docker 容器尝试使用位于

host.docker.internal
的 docker 内部解析器来查找
127.0.0.11
。除了
host.docker.internal
之外,所有查询都会正确解析。修复方法是将
ipv6=off
标志添加到
nginx.conf
中的解析器行。


0
投票

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

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

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


0
投票

在 Linux 上,接受的答案对于连接同一 Docker 网络下的容器来说效果很好,但它不适用于

host.docker.internal
或任何在组合中使用
--add-host
extra_hosts
的域,因为 Docker 的默认 DNS 127.0.0.11 不适用包括存储到
extra_hosts
文件中的
--add-host
/etc/hosts
条目。 2 个简单的解决方法是:

  1. 将 host.docker.internal 更改为 172.17.0.1,不确定 Docker 是否始终使用相同的 IP。

  2. 安装 dnsmasq 并在容器内运行 dnsmasq。将 nginx 解析器设置为 127.0.0.1.


-3
投票

您需要像

dnsmasq
这样的本地 DNS 服务器才能使用 127.0.0.1 进行解析。尝试使用
apk add --update dnsmasq
安装它,如果您使用的是 alpine (
nginx:alpine
) 变体,请进行设置。

© www.soinside.com 2019 - 2024. All rights reserved.