【问题标题】:Docker container internal vs external dns resolution issue using Traefik使用 Traefik 的 Docker 容器内部与外部 dns 解析问题
【发布时间】:2023-03-22 21:35:01
【问题描述】:

Docker 18.06.1-ce、traefik 1.7.3、dnsmasq、Mac 10.14

我使用 Traefik 进行了 docker-compose 设置,需要从 docker 网络/容器内部和外部访问多个服务。

在 linux 机器上(Let'sEncrypt 和 http 重定向到 https),一切都使用相同的 FQDN 进行 docker 容器内部和外部访问,我不必使用服务名称。

当我使用 docker-compose exec belapi /bin/bash 从管道容器内部运行 curl http://belapi.dev.biodati.test 时,我收到以下错误(我没有看到它出现在 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

我还可以在我的 Mac 上的 docker 容器外的 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-compose 文件:

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

【问题讨论】:

    标签: docker docker-compose traefik dnsmasq


    【解决方案1】:

    有关如何解决此问题的完整详细信息: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
    

    为我可以在 DNSMasq 中使用的 127.0.0.1 添加了一个别名,而不是 127.0.0.1,它仍然会映射到我的本地主机,但它也适用于从我的 docker 容器进行路由。

    现在我可以在我的 Mac 上使用本地域在 Docker 中进行本地开发,并从我的主机和通过容器间请求访问我的容器。

    【讨论】:

    • 我将它与桥接网络一起使用,但它仍然不适合我 - 但这让我很接近。我需要在docker-compose.yml 中将dns 属性添加到我的服务中,该属性指向上面创建的别名10.254.254.254
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2020-06-19
    • 1970-01-01
    • 2020-11-08
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多