【发布时间】:2018-08-28 04:19:39
【问题描述】:
上下文
我计划通过在本地引入虚拟主机来简化多个docker-compose.yml 的一些开发设置。我环顾四周,决定使用nginx-proxy 作为反向代理(能够为每个服务设置VIRTUAL_HOST)。
设置
为了在主机上公开这些,我采用了dnsmasq 的路线并添加了/etc/resolver/test/ 和nameserver 127.0.0.1。
我使用dev/docker-compose.yml 文件将上述内容付诸实施:
version: '3.5'
services:
nginx-proxy:
image: jwilder/nginx-proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/tmp/docker.sock:ro"
dnsmasq:
image: andyshinn/dnsmasq
restart: 'always'
ports:
- "53:53/tcp"
- "53:53/udp"
cap_add:
- NET_ADMIN
command: --log-facility=-
volumes:
- ./data/dnsmasq.conf:/etc/dnsmasq.conf
- ./data/dnsmasq.d:/etc/dnsmasq.d
networks:
default:
external:
name: proxynet
data/dnsmasq.conf 文件仅包含 address=/test/127.0.0.1。
我还创建了一个外部网络 proxynet 并将其用作 docker-compose 文件 (docker network create proxynet) 的默认网络。然后,这允许将其他 docker-compose 文件和服务链接到代理。
我有以下proj1/docker-compose.yml:
version: "3.5"
services:
proj1-web:
image: jwilder/whoami
environment:
- VIRTUAL_HOST=proj1-web.test
networks:
default:
external:
name: proxynet
同时运行这两个 docker-compose 文件(即docker-compose up)我可以从我的本地计算机访问proj1-web.test。一切正常。
现在我希望能够在另一个容器中引用 proj1-web.test 并让它解析到正在运行的容器。
我将创建proj2/docker-compose.yml(与之前类似,只是名称不同):
version: "3.5"
services:
proj2-web:
image: jwilder/whoami
environment:
- VIRTUAL_HOST=proj2-web.test
networks:
default:
external:
name: proxynet
随着一切运行,我可以从本地计算机访问proj1-web.test 和proj2-web.test。我可以在 proj1 和 proj2 之间成功地 curl 不同的服务:docker-compose run proj1-web sh -c "apk update -qq; apk add curl -qq; curl -v proj2-web:8000"。
问题
问题是我无法从proj1 卷曲虚拟主机的名称proj2-web.test:docker-compose run proj1-web sh -c "apk update -qq; apk add curl -qq; curl -v proj2-web.test":
* Rebuilt URL to: proj2-web.test/
* Trying 127.0.0.1...
* TCP_NODELAY set
* connect to 127.0.0.1 port 80 failed: Connection refused
* Failed to connect to proj2-web.test port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to proj2-web.test port 80: Connection refused
这里有什么我遗漏的吗?似乎各个容器无法访问从dnsmasq 提供给我的本地计算机的 DNS,我无法弄清楚如何授予它们访问权限。也许我的做法是错误的——我愿意接受建议。
【问题讨论】:
-
所以您希望 proj2-web 能够识别 dnsmasq dns 而无需将其配置为使用该 DNS?
-
不熟悉设置,您是否希望 proj2-web 能够识别 dnsmasq dns 而无需将其配置为使用该 DNS ?还有什么告诉 DNS 服务在请求针对特定域时指向哪个 IP?
-
@Bizmate 我认为这是计划。我正在寻找一种方法让容器使用我的主机的 DNS(因为它在那里工作),或者在 docker 网络中使用 DNS+代理。我对 Docker(或 DNS/网络启动)不太熟悉,所以我怀疑我在这里遗漏了一些关键的东西。有趣的是我可以使用
docker-compose exec proj1-web sh -c "apk update -qq; apk add curl -qq; ping -c1 proj2-web.test"成功ping 容器。 -
我正在尝试做类似的事情。你搞定了吗?
标签: docker nginx docker-compose reverse-proxy dnsmasq