docker-compose不把主机名添加到/ etc / hosts

我正在做一个docker-composeconfiguration,它应该启动一个连接到dnsmasq容器的openvpn容器。 openvpn服务器应该自动发现dnsmasq容器并将其用作dns服务器。 发现是通过在/ etc / hosts文件中search条目“dnsmasq”来完成的。

我有以下docker-compose.yml文件:

version: '2' services: data: build: ./ dnsmasq: cap_add: - NET_ADMIN hostname: dnsmasq image: <dnsmasq image> ports: - 53:53/udp restart: always openvpn: cap_add: - NET_ADMIN depends_on: - data - dnsmasq image: <openvpn image> ports: - 1194:1194/udp restart: always volumes_from: - data 

我已经指定了“dnsmasq”作为dnsmasq容器的主机名,并且希望它出现在openvpn容器的“/ etc / hosts”中。 这似乎并没有发生。

这是来自openvpn容器内/ etc / hosts的转储:

 openvpn_1 | 127.0.0.1 localhost openvpn_1 | ::1 localhost ip6-localhost ip6-loopback openvpn_1 | fe00::0 ip6-localnet openvpn_1 | ff00::0 ip6-mcastprefix openvpn_1 | ff02::1 ip6-allnodes openvpn_1 | ff02::2 ip6-allrouters openvpn_1 | 172.19.0.4 d44a72f42ef9 

我期望d44a72f42ef9是“dnsmasq”。

我究竟做错了什么?

我正在运行docker-compose 1.8.1。

在docker中,旧版本的链接通过添加到/ etc / hosts来工作。 很有可能你的系统最初是在这个范例中设置的,在这个范例中,检索容器分辨率的方法是在/ etc / hosts中构build的。

docker的新版本,但不需要这个。 只要容器在同一个networking上,它们就会自动允许服务名称parsing。 所以你可以通过它来访问它:

 http://dnsmasq:port 

首先,你需要添加一个“链接”键到你docker-compose.yml像这样:

 services: dnsmasq: ... openvpn: ... links: - dnsmasq 

此主机名的DNSparsing不是通过/etc/hosts而是通过Docker Embedded DNS来处理的 。 你可以使用普通的DNS工具来查询它:

 $ getent hosts dnsmasq $ nslookup dnsmasq $ dig dnsmasq A $ # etc... 

显然,主机文件不会得到更新。 主机“dnsmasq”只是使用其他一些不同的机制。 这可以使用以下validation:

ping -c1 dnsmasq