无法使用 docker-compose 使用 nginx-proxy 和 dnsmasq 访问容器之间的虚拟主机
Cannot access virtual hosts between containers with docker-compose using nginx-proxy and dnsmasq
上下文
我正计划通过在本地引入虚拟主机来简化多个 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
之间成功卷曲不同的服务: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,我不知道如何授予它们访问权限。也许我以错误的方式解决这个问题——我愿意接受建议。
我最终创建了一个解决方案来解决我的问题。您可以在此处查看该工具的存储库:
https://github.com/scoremedia/dcdc
我还创建了一个博客 post 详细介绍了一些内容:https://kevinjalbert.com/docker-compose-dns-consistency-dcdc/
希望这对其他人有帮助。
上下文
我正计划通过在本地引入虚拟主机来简化多个 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
之间成功卷曲不同的服务: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,我不知道如何授予它们访问权限。也许我以错误的方式解决这个问题——我愿意接受建议。
我最终创建了一个解决方案来解决我的问题。您可以在此处查看该工具的存储库:
https://github.com/scoremedia/dcdc
我还创建了一个博客 post 详细介绍了一些内容:https://kevinjalbert.com/docker-compose-dns-consistency-dcdc/
希望这对其他人有帮助。