traefik主机名适用于Web应用程序,但不适用于mongodb

时间:2017-04-19 13:40:28

标签: docker docker-compose traefik

我正在使用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容器上。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

使用本机docker网络的解决方案

但是,你可以解决这个问题!由于您使用的是docker,因此您可以使用代码中的容器名称进行处理(假设mongo和您的mongo访问代码都在共享docker网络上的容器中运行。如果容器是用{编译的话}就是这种情况。 {1}})。运行以下命令以查看您的容器是否正确链接:

  1. 运行CancellationTokenSource.Cancel()以使您的容器名称正常运行(在docker-compose列下)
  2. 运行docker ps以查看您的网络名称
  3. 运行NAMES以验证步骤1中的容器是否在同一网络上。
  4. 我从三个单独的撰写文件中运行docker-compose,因此您应该能够覆盖以下大多数情况(对于任何语法错误道歉,以下是剥离的代码示例):

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

    docker network ls
    来自我的docker-compose文件的

    片段,它旋转了mongo

    docker network inspect <target_network_name>
    来自docker-compose的

    片段,其中有mongo访问代码

    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
    

    代码中的连接

    不确定你正在使用什么语言,这就是下面的js代码看起来像我连接到mongo(在'topicOntologyBuilder`容器内,同时使用traefik作为代理(再次,这是有效的,因为我们是充分利用码头网络:

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

    为什么会这样?

    这是有效的,因为docker在容器中做了一些聪明的DNS内容,这样每个容器都知道其他容器的IP,通过容器名称在DNS条目中查找

    额外英特尔

    如果您的容器位于不同的计算机/虚拟机上,您可能想要使用服务发现工具(Consul可以很好地使用Traefik)或使用docker network overlay的特定容器进行操作。集群。

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