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

标签 java docker dns network-programming docker-compose

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

我的 Docker 版本 jetty --版本 Docker 版本 17.09.0-ce,构建 afdb6d4

我的 Docker-Compose 版本 docker-compose --version docker-compose 版本 1.16.1,构建 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"

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

我的问题是:

1) 容器出现后...当我进入容器时,例如在本例中 server-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

最佳答案

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

用户定义的网络和 DNS

Docker compose 定义为 v2+默认情况下创建用户定义的网络。

具有用户定义网络的 Docker 使用 embedded DNS server以便 Docker 可以响应本地容器请求(服务发现)。

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

Docker DNS

使用内部 DNS 服务器时要小心。如果在创建先有鸡还是先有蛋的问题时将系统 DNS 指向容器,Docker 守护进程中的内容就会崩溃,Docker 需要 DNS 才能启动,但无法启动容器来提供 DNS。

由于您的示例配置仅为一个应用程序容器设置 DNS,因此应该没问题,但是 make sure the DNS container is up and healthy在你申请之前。

关于java - 如何从 docker-compose 文件覆盖/etc/resolv.conf 中的 Docker 嵌入式 DNS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041507/

相关文章:

java - 如何检查线程是否完成了任务?

Vagrant + docker 错误

docker - 为什么我的 AWS CodeBuild 命令没有运行?

iis - 从 IIS 重定向到 tomcat?

sql-server - SQL Server 2008 - 登录失败。该登录来自不受信任的域,无法与 Windows 身份验证一起使用

java - 需要行动监听者的建议

java - Lambda 表达式必须在方法内部吗?它们可以作为类的成员存在于方法之外吗

java - 无法解决 Classnotfound 异常

Docker 镜像名称自动更改

linux - 解析路由以获取网关/DNS