【问题标题】:Docker container to container DNS with containerised DNS server使用容器化 DNS 服务器的 Docker 容器到容器 DNS
【发布时间】:2020-04-28 11:23:04
【问题描述】:

我很难弄清楚如何让 DNS 为容器到容器的通信工作。我有 dnsmasq 和 Traefik 以及许多其他服务。下面的 docker-compose.yml 是一个精简版,用于说明我的设置。

基本上我想我想将寻找 *.domain.test 的容器和外部流量引导到 Traefik 容器。我一直在寻找一种优雅的方式来做到这一点。非常感谢任何帮助。

将堆栈调高后,我运行:

docker run --rm --network=traefik praqma/network-multitool dig domain.test

然后得到:

; <<>> DiG 9.14.8 <<>> domain.test
;; global options: +cmd
:: connection timed out; no servers could be reached

docker-compose.yml

version: "3.7"

networks:
  dns: {}
  traefik:
    name: traefik

volumes:
  heimdall-data:

services:
  dnsmasq:
    cap_add:
    - NET_ADMIN
    command:
    - --cache-size=1000
    - --local-ttl=10
    - --address=/.domain.test/192.168.1.10
    - --address=/#/0.0.0.0
    container_name: dnsmasq
    image: andyshinn/dnsmasq:2.78
    labels:
      traefik.enable: "False"
    networks:
      dns: null
    ports:
    - "53:53/tcp"
    - "53:53/udp"
    restart: unless-stopped

  traefik:
    command:
    - --api.insecure=true
    - --providers.docker=true
    - --providers.docker.exposedbydefault=true
    - --entrypoints.web.address=:80
    - --log.level=ERROR
    container_name: traefik
    image: traefik:2.1
    labels:
      traefik.enable: "true"
      traefik.http.routers.api.entrypoints: web
      traefik.http.routers.api.rule: Host(`traefik.domain.test`)
      traefik.http.routers.api.service: api@internal
    networks:
      traefik: null
    ports:
    - 80:80
    - 443:443
    restart: unless-stopped
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro

  heimdall:
    container_name: heimdall
    image: linuxserver/heimdall:2.2.2-ls66
    labels:
      traefik.docker.network: traefik
      traefik.http.routers.heimdall.entrypoints: web
      traefik.http.routers.heimdall.rule: Host(`www.domain.test`, `domain.test`)
    networks:
      traefik: null
    restart: unless-stopped
    volumes:
    - heimdall-data:/config:rw


【问题讨论】:

  • 当您运行dig domain.test 而不指定 DNS 服务器时,dig 将默认为容器的默认值。当你运行 docker run --rm --network=traefik praqma/network-multitool dig domain.test @&lt;dnsmasq ip&gt; 时会发生什么?
  • 我收到同样的“无法访问服务器”消息。

标签: docker docker-compose dns traefik dnsmasq


【解决方案1】:

当您使用 --net--network 运行容器时,docker 将使用自己的 DNS 服务器来发现使用它运行的服务。以及发送到 docker 引擎的所有 DNS 查询。

在正常情况下(使用默认网络时),您可以在运行命令上使用 --dns 选项 但是当您使用自定义网络运行图像时,您必须将自定义 resolv. conf 文件添加到容器中。 你在你的系统上创建一个并命名为custom-resolv.conf

在此文件中,您可以添加您的自定义 dns 地址并将其添加到您的容器中。

nameserver 1.0.0.1
nameserver 4.2.2.4

那么你必须将这个小部分添加到你的运行命令中:

-v /path/to/file/custom-resolv.conf:/etc/resolv.conf:ro
docker run --rm --network=traefik -v /path/to/file/custom-resolv.conf:/etc/resolv.conf:ro praqma/network-multitool dig domain.test

使用ro 进行只读卷映射。 即使您的容器已启动,您也可以执行到您的容器并检查 /etc/resolv.conf 文件 必须与 custom-resolv.conf 相同

现在您的所有 DNS 请求都发送到您的 DNS 服务器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2020-11-08
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多