【问题标题】:traefik hostname works for web apps but not for mongodbtraefik 主机名适用于 Web 应用程序,但不适用于 mongodb
【发布时间】:2017-04-19 13:40:27
【问题描述】:

我正在使用 docker-compose 和 traefik 运行一个 mongo 实例。

myapp-mongo:
  build: ../images/myapp-mongo
  restart: always
  ports:
    - "27017:27017"
  labels:
    - "traefik.ports=27017,27018"
    - "traefik.backend=myapp-mongo"
    - "traefik.frontend.rule=Host:myapp-mongo.docker.localhost"
  networks:
    - development
  environment:
    - MONGO_USER=${MONGO_USER}
    - MONGO_PASSWD=${MONGO_PASSWD}
    - MONGO_AUTHDB=${MONGO_AUTHDB}

Mongo 运行良好,我可以在我的 Mac 上使用 127.0.0.1 进行连接。

问题是我无法使用主机名myapp-mongo.docker.localhost 进行连接。它仅适用于 IP 127.0.0.1。

尝试 ping IP 127.0.0.1 响应正常,但尝试 ping 主机名不起作用。

我已经将 127.0.0.1 proxy.docker.localhost 添加到 /etc/hosts 以使 traefik 正常工作。

所有其他网络应用程序的主机名都可以正常工作,例如myapp.docker.localhost。这个问题只发生在这个 mongodb 容器上。

【问题讨论】:

    标签: docker docker-compose traefik


    【解决方案1】:

    可能是因为 Træfik 是 HTTP 代理,所以只支持 HTTP/HTTPS 连接。

    【讨论】:

    • 来自 traefik 的 github 帐户的一些支持证据:github.com/containous/traefik/issues/10 *请注意,功能请求仅在发布此评论时强调它是 HTTP(S)(没有链接的 PR、操作或行动项目)
    【解决方案2】:

    我相信@bpatel 是对的(请参阅我在他的回答中留下的评论以及 github 对话的链接) Traefik 在撰写本文时仅支持 HTTP/HTTPS。

    使用原生 docker 网络的解决方案

    但是,您可以解决此问题!由于您使用的是 docker,因此您可以通过在代码中使用容器名称来解决问题(假设 mongo 和您的 mongo 访问代码都在共享 docker 网络上的容器中运行。如果容器使用 @ 启动,就会出现这种情况987654322@)。运行以下命令以查看您的容器是否正确链接:

    1. 运行 docker ps 以运行您的容器名称(在 NAMES 列下)
    2. 运行 docker network ls 以查看您的网络名称
    3. 运行 docker network inspect <target_network_name> 以验证您在第 1 步中的容器是否在同一网络上。

    我从三个单独的 compose 文件运行 docker-compose,因此您应该能够涵盖以下大多数情况(对任何语法错误表示歉意,以下是精简的代码示例):

    启动 traefik 的整个 docker-compose 文件(在目录名称“proxy”下)

    version: '2'
    services:
      traefik:
        image: traefik
        command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
        networks:
          - webgateway
        ports:
          - "80:80"
          - "8080:8080"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /dev/null:/traefik.toml
    networks:
      webgateway:
        driver: bridge
    

    sn-p 来自我的 docker-compose 文件,它启动了 mongo

    version: '2'
    services:
      database:
        image: mongo
        ports:
          - "27017:27017"
        networks:
          - web
    networks:
      web:
        external:
          name: proxy_webgateway
    

    来自 docker-compose 的 sn-p 具有 mongo 访问代码

    version: '2'
    services:
      topicOntologyBuilder:
        image: topic-ontology-builder
        labels:
          - "traefik.backend=topicOntologyBuilder"
          - "traefik.port=80"
          - "traefik.frontend.rule=Host:topic-ontology.docker.localhost"
        networks:
          - web
        volumes:
          - ./:/home
    networks:
      web:
        external:
          name: proxy_webgateway
    

    代码中的连接

    不确定您使用的是什么语言,这就是我连接到 mongo 的以下 js 代码的样子(在那个 'topicOntologyBuilder` 容器中,同时使用 traefik 作为代理(同样,这有效,因为我们正在充分利用 docker 网络):

    var MongoClient = require('mongodb').MongoClient;
    MongoClient.connect('mongodb://<MONGO_CONTAINER_NAME>/<DB_NAME>', function(err, db) {
        //insert code here to interact with mongo
    })
    

    为什么会这样

    之所以可行,是因为 docker 在容器中做了一些巧妙的 DNS 操作,以便每个容器都知道其他容器的 IP,通过在它们的 DNS 条目中查找它,通过容器名称

    额外情报

    如果您的容器位于不同的计算机/虚拟机上,您可能想要使用服务发现工具(Consul 与 Traefik 配合得很好)或使用特定于集群中容器的 docker network overlay 做一些花哨的事情.

    如果使用原始 docker 网络,您可以分配容器别名(但这不适用于 Traefik,或者至少几个月前还没有)。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多