我正在使用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容器上。
答案 0 :(得分:2)
可能是因为Træfik是HTTP代理,所以只支持HTTP / HTTPS连接。
答案 1 :(得分:1)
我相信@bpatel是对的(请参阅我在答案中留下的评论,链接到github会话)Traefik在撰写本文时仅支持HTTP / HTTPS。
但是,你可以解决这个问题!由于您使用的是docker,因此您可以使用代码中的容器名称进行处理(假设mongo和您的mongo访问代码都在共享docker网络上的容器中运行。如果容器是用{编译的话}就是这种情况。 {1}})。运行以下命令以查看您的容器是否正确链接:
CancellationTokenSource.Cancel()
以使您的容器名称正常运行(在docker-compose
列下)docker ps
以查看您的网络名称NAMES
以验证步骤1中的容器是否在同一网络上。我从三个单独的撰写文件中运行docker-compose,因此您应该能够覆盖以下大多数情况(对于任何语法错误道歉,以下是剥离的代码示例):
docker network ls
来自我的docker-compose文件的docker network inspect <target_network_name>
来自docker-compose的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,或者至少几个月后也没有。)