如何在docker-compose文件中覆盖/etc/resolv.conf中Docker的嵌入式DNS服务器

Saf*_*fik 2 java dns network-programming docker docker-compose

我正在使用docker-compose命令来创建和启动我的容器.

我的Docker版本 docker --version Docker version 17.09.0-ce, build afdb6d4

我的Docker-Compose版本 docker-compose --version docker-compose version 1.16.1, build 6d1ac21

我正在使用的.yml文件看起来像这样:(请注意,我只是缩短它以将敏感的东西拿出来)

---
services:
  zookeeper:
    image: "zookeeper"
  server-1:
    cap_add:
    - "NET_ADMIN"
  server-0:
    cap_add:
    - "NET_ADMIN"
    dns:
    - 8.8.8.8
    - 9.9.9.9
    environment:
      SERVER_ID: 0
      NETEM_HOSTS: ""
      LOSS_VALUES: ""
      MAX_RATE_VALUES: ""
      DELAY_VALUES: ""
    image: "cloud.mycompany.com:5000/server-0:latest"
  fakedns:
    image: "cloud.mycompany.com:5000/fakedns:latest"
version: "3.3"
Run Code Online (Sandbox Code Playgroud)

然后我开始使用: docker-compose --file compose.yml up -d

我的问题是:

1)容器出现后......当我进入容器时,例如在这种情况下服务器-0,我没有看到/etc/resolv.conf文件已更新为使用这些名称服务器.相反,它使用docker的嵌入式dns,即127.0.0.11

2)如何确保它使用我在docker-compose使用的文件中指定的内容

3)我尝试使用命令执行此操作,它似乎工作,但我需要从compose-file docker run -p 4000:53 --dns=8.8.8.8 cloud.mycompany.com:5000/server-0:latest

4)理想情况下,我希望它拥有容器'fakedns'的IP地址,以便它使用这个而不是嵌入式的@ 127.0.0.11

Mat*_*att 5

您不会看到自定义DNS服务器,/etc/resolv.conf但Docker的解析器会将DNS请求转发给它们.

用户定义的网络和DNS

Docker构成定义为v2 +默认创建用户定义的网络.

具有用户定义网络的Docker使用嵌入式DNS服务器,以便Docker可以响应本地容器请求(服务发现).

对于Docker无法解析的任何DNS主机,请求将被转发到DNS服务器.这是系统默认服务器,配置的服务器dockerd或在运行时为容器配置的DNS服务器.

Docker DNS

使用内部DNS服务器时要小心.如果您在创建鸡蛋或鸡蛋问题时将系统DNS指向容器,Docker守护程序中的内容将会中断,Docker需要DNS启动但无法启动容器来提供DNS.

由于您的示例配置仅为一个应用程序容器设置DNS,因此应该没问题,但在应用程序之前确保DNS容器已启动且运行正常.