在 Docker 容器中使用 dnsmasq 作为主机和 Docker 内部 DNS 解析

在 Docker 容器中使用 dnsmasq 作为主机和 Docker 内部 DNS 解析

我正在开发一个由多个服务组成的 Web 项目。每个服务都有自己的 docker-compose.yml 文件,该文件声明了它的“应用程序”及其可能的依赖项(数据库等)。为了让它们能够很好地协同工作,我构建了一个本地开发环境,将其与一个 nginx 代理绑定在一起,该代理具有带有正确服务器名称的服务器块,然后使用 Docker 的网络将请求通过 proxy_pass 传递到实际容器。

我还在容器中添加了 dnsmasq 来辅助 DNS,以便在本地使用域名而不是 localhost:port 组合(通过将测试 tld 的解析器添加到 127.0.0.1)。

代理docker-compose:

services:
    local-proxy:
        build: ./nginx
        ports:
            - 80:80
            - 443:443

    local-proxy-dnsmasq:
        build: ./dnsmasq # builds on top of 4km3/dnsmasq
        ports:
            - "53:53/tcp"
            - "53:53/udp"
        cap_add:
            - NET_ADMIN
networks:
    default:
        external:
            name: domain-local

dnsmasq.conf:

listen-address=0.0.0.0
interface=eth0
user=root

address=/.test/0.0.0.0

代理 nginx 服务器示例:

server {
    server_name login.domain.test;
    location / {
        # headers...
        proxy_pass http://domain-login:8080;
    }
}

其中一个服务的docker-compose示例:

services:
    domain-login:
        build: # ...
        networks:
            - default
            - domain-local

所有这些在浏览器中都能完美运行,我可以访问tenant.domain.test,然后重定向到login.domain.test......

但是,当运行 tenant.domain.test 的容器必须从其容器向其他容器之一(例如 login.domain.test 以完成 oauth 流程)发出 curl 请求时,它会失败,因为它试图login.domain.test通过转到自身来解析:

root@6d25c2f5daf1:/var/www/app# nslookup login.domain.test
Server:     127.0.0.11
Address:    127.0.0.11#53

Non-authoritative answer:
Name:   login.domain.test
Address: 0.0.0.0
;; connection timed out; no servers could be reached

如果我将 dnsmasq.conf 从 更改address=/.test/0.0.0.0address=/.test/10.0.1.102(我电脑当前分配的 IP),一切正常。但是,这当然不是适合同事的解决方案。有人能帮我找到正确的 Google 路径吗?或者有解决办法吗?

答案1

该行address=/.test/0.0.0.0指示dnsmasq将域名解析test为 IP 地址0.0.0.0。地址0.0.0.0不是有效的 IP 地址。某些浏览器(例如 chrome)可以处理它,127.0.0.1但这是非标准行为。

答案2

刚看到这个问题,想快速回答一下。因为楼主说

例如为同事提供工作解决方案

我明白 OP 想要一个可共享的 IP,当然可以来自办公网络。(只需执行ifconfig或执行其他操作即可获取您的 com ip 并使用 dnsmasq 分配该 ;p)

相关内容