Docker 使用 Traefik 的容器内部与外部 dns 解析问题
Docker container internal vs external dns resolution issue using Traefik
Docker 18.06.1-ce,traefik 1.7.3,dnsmasq,Mac 10.14
我使用 Traefik 进行了 docker-compose 设置,需要从 docker network/containers 内部和外部访问多项服务。
在 linux 盒子上(使用 Let'sEncrypt 和 http 重定向到 https),一切都使用相同的 FQDN 用于 docker 容器内部和外部访问,而我没有使用服务名称。
当我 运行 curl http://belapi.dev.biodati.test
从管道容器内部使用 docker-compose exec belapi /bin/bash 我收到以下错误(我没有看到它出现在 Traefik 访问日志中):
api@407cf7105aee:/app$ curl http://belapi.dev.biodati.test/status
curl: (7) Failed to connect to belapi.dev.biodati.test port 80: Connection refused
这工作正常(使用服务名称):
curl http://belapi:8000/status
我还可以 运行 在 docker 容器外的 Mac 上 bash shell 进行以下罚款(我看到它击中了Traefik 访问日志):
curl http://belapi.dev.biodati.test/status
我有 dnsmasq 设置将所有 *.test 域转发到 127.0.0.1。
从管道容器内部:
dig belapi.dev.biodati.test
;; QUESTION SECTION:
;belapi.dev.biodati.test. IN A
;; ANSWER SECTION:
belapi.dev.biodati.test. 7 IN A 127.0.0.1
我的docker-撰写文件:
networks:
biodati:
external: true
services:
pipeline:
container_name: pipeline
image: biodati/bel_pipeline:dev
networks:
biodati:
traefik:
image: traefik:1.7
container_name: traefik
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./conf/traefik.toml:/traefik.toml
- ./logs:/logs
networks:
biodati:
labels:
- traefik.enable=true
- traefik.backend=traefik
- traefik.frontend.rule=Host:traefik.${BS_HOST_NAME:?err}
- traefik.port=8080
- traefik.docker.network=biodati
# BEL API - core requirement
belapi:
container_name: belapi
image: belbio/bel_api:localdev
networks:
biodati:
labels:
- traefik.enable=true
- traefik.backend=belapi
- traefik.frontend.rule=Host:belapi.${BS_HOST_NAME:?err};
- traefik.port=8000
- traefik.docker.network=biodati
有关如何解决此问题的完整详细信息:https://medium.com/@williamhayes/local-dev-on-docker-fun-with-dns-85ca7d701f0a
基本上 - DNSMasq 运行良好,Mac Docker 桌面 DNS 映射运行良好。我可以查询我的服务域名(例如 service1.test)dig service1.test1
并返回 127.0.0.1,这正是我在 DNSMasq 中设置的。所以我的域名为我的主机返回了正确的 IP 地址。除了 - 我把这个放在我的容器里 - 所以 127.0.0.1 指的是我的容器环境。
运行 在终端的 Mac 主机级别上执行以下命令:
sudo ifconfig lo0 alias 10.254.254.254
为 127.0.0.1 添加了一个别名,我可以在 DNSMasq 中使用它而不是 127.0.0.1,它仍然会映射到我的本地主机,但它也适用于从我的 docker 容器进行路由。
现在我可以在 Mac 上使用本地域在 Docker 中进行本地开发,并通过容器间请求从我的主机访问我的容器。
Docker 18.06.1-ce,traefik 1.7.3,dnsmasq,Mac 10.14
我使用 Traefik 进行了 docker-compose 设置,需要从 docker network/containers 内部和外部访问多项服务。
在 linux 盒子上(使用 Let'sEncrypt 和 http 重定向到 https),一切都使用相同的 FQDN 用于 docker 容器内部和外部访问,而我没有使用服务名称。
当我 运行 curl http://belapi.dev.biodati.test
从管道容器内部使用 docker-compose exec belapi /bin/bash 我收到以下错误(我没有看到它出现在 Traefik 访问日志中):
api@407cf7105aee:/app$ curl http://belapi.dev.biodati.test/status
curl: (7) Failed to connect to belapi.dev.biodati.test port 80: Connection refused
这工作正常(使用服务名称):
curl http://belapi:8000/status
我还可以 运行 在 docker 容器外的 Mac 上 bash shell 进行以下罚款(我看到它击中了Traefik 访问日志):
curl http://belapi.dev.biodati.test/status
我有 dnsmasq 设置将所有 *.test 域转发到 127.0.0.1。
从管道容器内部:
dig belapi.dev.biodati.test
;; QUESTION SECTION:
;belapi.dev.biodati.test. IN A
;; ANSWER SECTION:
belapi.dev.biodati.test. 7 IN A 127.0.0.1
我的docker-撰写文件:
networks:
biodati:
external: true
services:
pipeline:
container_name: pipeline
image: biodati/bel_pipeline:dev
networks:
biodati:
traefik:
image: traefik:1.7
container_name: traefik
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./conf/traefik.toml:/traefik.toml
- ./logs:/logs
networks:
biodati:
labels:
- traefik.enable=true
- traefik.backend=traefik
- traefik.frontend.rule=Host:traefik.${BS_HOST_NAME:?err}
- traefik.port=8080
- traefik.docker.network=biodati
# BEL API - core requirement
belapi:
container_name: belapi
image: belbio/bel_api:localdev
networks:
biodati:
labels:
- traefik.enable=true
- traefik.backend=belapi
- traefik.frontend.rule=Host:belapi.${BS_HOST_NAME:?err};
- traefik.port=8000
- traefik.docker.network=biodati
有关如何解决此问题的完整详细信息:https://medium.com/@williamhayes/local-dev-on-docker-fun-with-dns-85ca7d701f0a
基本上 - DNSMasq 运行良好,Mac Docker 桌面 DNS 映射运行良好。我可以查询我的服务域名(例如 service1.test)dig service1.test1
并返回 127.0.0.1,这正是我在 DNSMasq 中设置的。所以我的域名为我的主机返回了正确的 IP 地址。除了 - 我把这个放在我的容器里 - 所以 127.0.0.1 指的是我的容器环境。
运行 在终端的 Mac 主机级别上执行以下命令:
sudo ifconfig lo0 alias 10.254.254.254
为 127.0.0.1 添加了一个别名,我可以在 DNSMasq 中使用它而不是 127.0.0.1,它仍然会映射到我的本地主机,但它也适用于从我的 docker 容器进行路由。
现在我可以在 Mac 上使用本地域在 Docker 中进行本地开发,并通过容器间请求从我的主机访问我的容器。