如何告诉Docker使用主机dns配置?

时间:2019-01-10 17:35:59

标签: docker dns docker-compose

我正在为公司代理工作。 由于实施了许多限制,因此在构建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

因此,这确实不是实现此目标的方法...但是我不确定应该如何执行它。 我试图将'dns'添加到docker-compose的服务中,但是我没有用(或者不是我所理解的方式),并且文档相当简明……

是否可以告诉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

只有“ my-project”需要访问公司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(+重新启动)(不要认为我需要那么多,但这是懒惰的方法!)。 。 ,不幸的是它没有解决问题。新值替换了容器中的前一个值,但始终无法到达dns

  

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

EDIT3:我在看错容器...因此,将docker daemon conf(/ etc / docker / daemon.json),然后从服务中删除“ dns”参数,魔术就会起作用!现在,我可以访问公司dns的名称(其中有很多点!!)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

即使您覆盖容器上的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