【问题标题】:How to tell docker to use host dns configuration?如何告诉 docker 使用主机 dns 配置?
【发布时间】:2019-06-05 15:25:08
【问题描述】:

我在公司代理背后工作。 由于强制执行的许多限制,当我来构建我的 docker 镜像(主要是基于 ubuntu 的镜像)时,我必须切换到公共网络。构建在同一台计算机上执行(因此,相同的 dns conf)。

除了构建之外,我总是在这个代理后面运行我的容器。 该公司还(而且确实)拥有自己的 dns。

不幸的是,我不明白如何以“正确的方式”将主机 dns 传递给容器,也不明白 docker 如何设法构建容器 resolv.conf。

当我查看我的主机时,我看到了这样一个 conf :

$ cat /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.8.4
nameserver 10.xxx.yyy.z
search rennes.mycompany.fr

在我的容器中,我看到了:

search rennes.mycompany.fr
nameserver 127.0.0.11
options ndots:0

让我觉得奇怪的是,在容器中只能找到主机配置的一部分...... 当我尝试从容器中访问任何公司托管的名称时,我遇到了名称解析失败。

但是,如果我将主机的 resolv.conf 名称服务器添加到容器的名称服务器中,它就可以工作:

$ echo nameserver 192.168.1.1 >> /etc/resolv.conf

所以,这确实不是这样做的方式......但我不确定我应该如何执行它。 我试图在 docker-compose 中将'dns' 添加到我的服务中,但我没有工作(或者不是我理解的方式),并且那里的文档非常简陋......

有没有办法告诉 docker 使用/共享主机的 dns 配置? 我的问题可能来自我在公司网络之外构建图像吗?

编辑: docker-compose.yml

version: '3.3'
services:
  my-apache:
    image: apache:latest
    ports:
      - 8088:80
    networks:
      - my-project-net
    dns: 
      - 192.168.1.1
    depends_on:
      - my-project
  my-project:
    image: my-project:latest
    networks:
      - my-project-net
    dns: 
      - 192.168.1.1

networks:
  my-project-net:
    driver: bridge

只有“我的项目”需要访问公司 dns,但我向两者都添加了 dns,以防我错过了一些线索...

编辑 2:更多细节和尝试

  • docker 版本:18.03.0-ce,构建 0520e24
  • docker-compose 版本:1.18.0,构建 8dd22a9

我尝试解析的名称如下所示:

some-pf-db.network.mycompany.fr

(修改后的)docker daemon conf 如下所示:

$ cat /etc/docker/daemon.json :

{
    "insecure-registries": [
        "some.test.registry.mycompany.fr:5000"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-file": "3",
        "max-size": "10m"
    },
    "dns-opts": ["ndots:15"]
}

在@BMitch link 之后,我尝试使用最多 15 个 ndots 选项来更新 docker daemon (+restart)(不认为我需要那么多,但这是一种懒惰的方式!)... 不幸的是,它并没有解决问题。新值替换了容器中的前一个值,但始终无法到达 dns

无法将主机名“some-pf-db.network.mycompany.fr”转换为 地址:名称解析暂时失败

EDIT3 : 我看错了容器……所以,在 docker daemon conf (/etc/docker/ daemon.json)并从服务中删除“dns”参数使魔术运行!我现在可以访问我公司的 dns 以获取名称(其中有很多点!!)

【问题讨论】:

  • 你能发布你的 docker-compose 文件吗,你的配置好像有错误
  • @wchik 在这里。

标签: docker dns docker-compose


【解决方案1】:

即使您覆盖容器上的 DNS,也需要容器内的 127.0.0.11 条目。这指向容器内的环回接口,该接口具有端口 53 的映射,以返回到 docker 引擎进行 DNS 解析。您需要 docker 进行 DNS 解析,以便使用 DNS 为您提供容器到容器网络以进行发现。

即使容器内有 127.0.0.11 条目,您仍然应该看到 docker 引擎调用您的 DNS 服务器,因此这不是错误或缺乏可配置性,您只是在容器内看不到此配置.

我们需要有关您遇到的实际问题的更多详细信息,但我之前看到的一个可能问题是,在某些特定情况下,DNS 无法解析没有完全限定名称的外部主机。您可以在此问题/线程中阅读有关内容: https://github.com/moby/moby/issues/32093

【讨论】:

  • 您提供的链接看起来很有希望...不幸的是,更改 docker daemon 中的 ndots 值并没有使其工作:( 我还尝试从 docker compose 中删除“dns”,但使用没有更多的成功!我在我的帖子中添加了更多详细信息。这些是你所期望的吗?
  • 等等...我的最新评论有误:它非常有效。我看错了(以前的)容器!虽然不知道这是否是一个合适的解决方案:但它至少是一种解决方法!
【解决方案2】:

如果您使用 docker-compose,则需要将 dns 部分添加到 yaml 文件中的服务定义中。 如果您直接为命令行运行 docker,您可以使用 --dns=IP_ADDRESS... 参数来定义您的公司名称服务器。

这里的文档中的更多详细信息:https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/

【讨论】:

  • 我已经在 docker-compose.yml 中添加了 dns conf(并告诉了它)。我应该提供一个 docker 文件更清楚,但我肯定已经尝试过了,但没有成功
猜你喜欢
  • 2022-09-28
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多