【问题标题】:Resolving subdomain.localhost doesn't work with docker swarm解析 subdomain.localhost 不适用于 docker swarm
【发布时间】:2018-07-18 05:51:22
【问题描述】:
我想要达到的目标:
- 本地主机上的 docker swarm
- dockerized 反向代理,它将 subdomain.domain 转发到带有应用程序的容器
- 带有应用程序的容器
我做了什么:
有什么问题:
- 无法通过子域访问容器。如果我使用端口,它可以工作
- curl 为子域和端口提供不同的结果
问题:
- 有什么问题?为什么?
- 如何调试它并找出问题是基于 docker 还是基于网络? (如何检查请求是否到达了我的容器)
我要补充一点,我也尝试在 docker-machine (virtualbox) 上执行此操作,但没有成功。所以我已经转移到 localhost,但正如你所见,它并没有太大帮助。
我正在失去希望,所以任何提示将不胜感激。提前谢谢你
【问题讨论】:
标签:
linux
docker
dns
docker-swarm
【解决方案1】:
回复晚了,但我能够使用 Traefik 的 2.x routers 功能实现这一点,如下所示:
labels:
- "traefik.http.routers.<unique name>.rule=Host(`subdomain.localhost`)"
在 docker-compose 文件中
version: '3.9'
services:
app:
image: myapp:latest
labels:
- "traefik.http.routers.myapp.rule=Host(`myapp.localhost`)"
reverse-proxy:
image: traefik:v2.4
command: --api.insecure=true --providers.docker
ports:
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "9000:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
我认为它起作用的原因是 Treafik 正在拦截 localhost 上的所有内容,然后应用规则,因此它的 Traefik 特定答案。
【解决方案2】:
没有像 localhost 的子域这样的东西。按照几乎通用的约定,localhost 解析为 IPv4 地址 127.0.0.1 和 IPv6 地址 ::1。
您仍然可以使用 docker 测试虚拟主机,但您必须使用端口:
curl -H Host:sub.localhost http://localhost:8000