我正在开发一个由多个服务组成的 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.0
为address=/.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)