4

我正在研究一个 docker-compose 配置,它应该启动一个连接到 dnsmasq 容器的 openvpn 容器。openvpn 服务器应该会自动发现 dnsmasq 容器并将其用作 dns 服务器。通过在 /etc/hosts 文件中搜索条目“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。

4

3 回答 3

5

旧版本的 docker 链接通过添加到 /etc/hosts 来工作。很可能您的系统最初是在此范例下设置的,其中检索容器分辨率的方法内置于 /etc/hosts.xml 中。

然而,较新版本的 docker 不需要这个。只要容器位于同一网络上,它们就会自动允许服务名称解析。因此,您可以通过以下方式访问它:

http://dnsmasq:port
于 2016-10-22T16:26:58.283 回答
1

首先,您需要为您的docker-compose.yml喜欢添加一个“链接”键:

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

此主机名的 DNS 解析不是通过 Docker Embedded DNS 处理的,/etc/hosts而是通过Docker Embedded DNS处理的。您可以使用普通的 DNS 工具查询它,如下所示:

$ getent hosts dnsmasq
$ nslookup dnsmasq
$ dig dnsmasq A
$ # etc...
于 2016-10-22T15:03:43.930 回答
0

显然,主机文件没有得到更新。主机“dnsmasq”只能使用其他一些不同的机制来使用。这可以使用以下方法进行验证:

ping -c1 dnsmasq

于 2016-10-22T14:19:00.363 回答