使用主机上的consul DNS解析容器

Nif*_*oid 9 dns docker consul

目的:获取一个docker容器,以使用主机提供的DNS,该主机是在另一个容器中运行的consul代理,以访问通过traefik反向代理提供的服务.

设置主机:Ubuntu 16.04.2 LTS

Registrator将新容器注册到领事代理,traefik是负责平衡服务并使其可用的反向代理.当您点击'/'路径时,会有一个通用节点应用程序返回"Hello World"

容器1.

docker run -d --net=host consul agent -dev
Run Code Online (Sandbox Code Playgroud)

容器2.

docker run -d  --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://localhost:8500
Run Code Online (Sandbox Code Playgroud)

容器3.

docker run -d --net=host -p 8089:8080 -p 80:80 --name=traefik -v ~/projects/traefix/docker.toml:/etc/traefik/traefik.toml traefik
Run Code Online (Sandbox Code Playgroud)

容器4.

docker run -P -d meep/node-web-app
Run Code Online (Sandbox Code Playgroud)

主机使用网络管理器

设置主机,因此任何查询领事TLD都将解析为领事泊坞器容器

/etc/NetworkManager/dnsmasq.d/10-consul
server=/consul/127.0.0.1#8600
Run Code Online (Sandbox Code Playgroud)

我有/etc/NetworkManager/dnsmasq.d/docker-bridge.conf以及以下配置,这意味着它将在docker网络接口上侦听DNS请求.

listen-address=172.17.0.1
Run Code Online (Sandbox Code Playgroud)

目前在我的主机上我可以执行以下操作

  1. dig node-web-app.service.consul返回127.0.0.1的ip地址
  2. curl http://node-web-app.service.consul/返回'Hello World'

到目前为止,在主机上工作的一切都很好.

我启动了一个容器

docker run --dns=172.17.0.1 -it joffotron/docker-net-tools
Run Code Online (Sandbox Code Playgroud)

并运行dig node-web-app.service.consul它返回127.0.0.1,至少dns部分工作.很明显,如果我现在运行curl http://node-web-app.service.consul/它将会破坏,因为dns查找指向127.0.0.1,它应该指向172.17.0.1

原谅我,我没有真正使用docker +服务发现 那么我该怎么做才能将容器DNS正确指向172.17.0.1

mic*_*ard -1

容器 4 没有使用与其他容器相同的网络(--net=host),因此您的 DNS 无法在所有情况下工作。

任何一个:

  • 您位于物理机网络上,并且必须使用其容器 IP 来寻址 Node-Web-App
  • 您位于 docker 网络内,并且必须获取机器的可路由 IP。

dig 返回 127.0.0.1 的事实是完全正常的,因为这就是你告诉他的,但是你的 node-web-app 无法在 127.0.0.1 访问(在本例中,这是这个特定 docker 容器的本地 IP)从挖掘容器中。