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

我用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工作。

所有其他Web应用程序的主机名正常工作,如myapp.docker.localhost 。 这个问题只发生在这个mongodb容器中。

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

我相信@bpatel是正确的(参见评论我留在他的答案链接到github对话)在编写本文时,Traefik只支持HTTP / HTTPS。

使用本地dockernetworking的解决scheme

但是,你可以解决这个问题! 由于你使用的是docker,你可以在你的代码中使用容器名称(假设mongo和你的mongo访问代码都运行在一个共享的dockernetworking的容器上),如果容器与docker-compose )。 运行以下命令查看您的容器是否正确连接:

  1. 运行docker ps以运行您的容器名称(在NAMES列下)
  2. 运行docker network ls来查看您的networking名称
  3. 运行docker network inspect <target_network_name>以validation来自步骤1的容器位于同一networking上。

我从三个独立的合成文件中运行docker-compose,所以你应该能够覆盖下面的大部分情况(对于任何语法错误的道歉,以下是精简的代码示例):

整个docker-compose启动traefik的文件(在目录名“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 

从我的docker组成的文件,旋转了孟戈片段

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

docker-compose中有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 

代码连接

不确定你正在使用什么语言,这是以下js代码看起来像我连接到mongo(在“topicOntologyBuilder”容器内,而使用traefik作为代理(同样,这是有效的,因为我们做的最多dockernetworking):

 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配合使用),或者使用特定于集群中的容器的dockernetworking覆盖层进行一些操作。

如果使用原始dockernetworking,您可以分配容器别名(尽pipe这不适用于Traefik,或者至less在几个月前没有)。