docker-compose не добавляет имя хоста в / etc / hosts

#networking #docker #docker-compose #openvpn #dnsmasq

#сеть #docker #docker-compose #openvpn #dnsmasq

Вопрос:

Я работаю над конфигурацией docker-compose, которая должна запустить контейнер openvpn, подключенный к контейнеру dnsmasq. Сервер openvpn должен автоматически обнаружить контейнер dnsmasq и использовать его в качестве dns-сервера. Обнаружение выполняется путем поиска записи «dnsmasq» в файле /etc/hosts.

У меня есть следующий файл 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 и ожидаю, что оно появится в «/ etc / hosts» в контейнере openvpn. Похоже, этого не происходит.

Это дамп из /etc/ hosts из контейнера openvpn:

 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.

Комментарии:

1. вы можете использовать extra_hosts директиву в вашем файле docker compose

2. @bjhaid Таким образом, IP может быть жестко запрограммирован в файле docker-compose

Ответ №1:

Более старые версии компоновки в docker работали путем добавления в /etc/ hosts. Вероятно, ваша система изначально была настроена в соответствии с этой парадигмой, где способ получения разрешения контейнера был встроен в /etc / hosts.

Однако более новые версии docker этого не требуют. Они автоматически разрешают разрешение имени службы, если контейнер находится в той же сети. Таким образом, вы можете получить к нему доступ через:

 http://dnsmasq:port
  

Комментарии:

1. Есть ли способ вывести список имен служб, доступных из запущенного контейнера?

Ответ №2:

Сначала вам нужно добавить ключ «ссылки» в свой docker-compose.yml вот так:

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

Разрешение DNS для этого имени хоста обрабатывается не через /etc/hosts , а скорее через встроенный в Docker DNS. Вы можете запросить его с помощью обычных инструментов DNS, таких как:

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

Ответ №3:

По-видимому, файлы hosts не обновляются. Хост «dnsmasq» просто доступен с использованием какого-то другого механизма. Это можно проверить с помощью:

ping -c1 dnsmasq