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

标签 docker dns docker-compose

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

只有“我的项目”需要访问公司的 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

    could not translate host name "some-pf-db.network.mycompany.fr" to address: Temporary failure in name resolution



    EDIT3:我正在查看错误的容器......因此,在 docker daemon conf (/etc/docker/daemon.json) 中将点 (ndots) 的阈值更改为(例如)15 并从中删除“dns”参数服务让魔法运转!我现在可以访问我公司的 dns 以获取名称(其中有很多点!!)

    最佳答案

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

    即使使用 127.0.0.11,您仍然应该看到 docker 引擎调用您的 DNS 服务器。进入容器内,所以这不是一个错误,或者缺乏可配置性,你只是在容器内看不到这个配置。

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

    关于docker - 如何告诉 docker 使用主机 dns 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54134098/

    相关文章:

    docker - Traefik 在 docker swarm 模式下将容器 ip (10.255.0.2) 作为远程地址转发

    shell - 从 Makefile 运行 docker exec 时看不到 shell 提示或输入

    docker - 从没有 xhost 但使用 xauth 的 docker 连接到 X11-server

    docker - oh-my-zsh 安装返回非零代码

    Docker 卷和绑定(bind)

    php - 多个php docker容器之间的通信

    c - bsd 或 posix 方式获得首选域 Controller ?

    c# - Entity Framework 协会 : Error Because the Dependent Role properties are not the key properties

    azure - 无法验证域所有权 azure 网站以添加子域

    mongodb - Docker为MongoDB ReplicaSet撰写