Консоль Docker-compose с использованием хост-DNS-сервера

Я использую несколько контейнеров на моем "сервере Ubuntu 16.10" в "настраиваемой" мостовой сети с compose 2.9 (в версии 2.1 для yml). Большинство моих контейнеров используют одни и те же порты, поэтому я не могу использовать сетевой драйвер "host". Все мои контейнеры - это ссылки, использующие атрибут выделенных links.

Но мне также нужен доступ к сервисам, доступным за пределами моих контейнеров. Эти службы имеют выделенный URL-адрес с именами, зарегистрированными на DNS-сервере моей компании. Хотя у меня нет проблем с использованием общедоступного DNS и доступом к любому общедоступному сервису из моих контейнеров, я просто не могу получить доступ к своему частному DNS.

Знаете ли вы рабочее решение для использования частного DNS из контейнера? Или, что еще лучше, использовать конфигурацию DNS хост-сети?

PS: Конечно, я могу ссылаться на сервисы моей компании, используя атрибут extra_hosts в моих сервисах в моем файле docker-compose.yml. Но... это определенно не цель иметь DNS. Я не хочу регистрировать все свои сервисы в своем YML файле и не хочу обновлять его каждый раз, когда в моей компании обновляется IP-адрес сервисов.

Контекст:

  • Хост: сервер Ubuntu 16.10
  • Докер Engine: 1.12.6
  • Докер Состав: 1.9.0
  • docker-compose.yml: 2.1
  • Сеть: собственный мост.

Файл docker-compose.yml (извлечение):

version: '2.1'
  services:
    nexus:
    image: sonatype/nexus3:$NEXUS_VERSION
    container_name: nexus
    restart: always
    hostname: nexus.$URL
    ports:
      - "$NEXUS_81:8081"
      - "$NEXUS_443:8443"
    extra_hosts:
      - "repos.private.network:192.168.200.200"
    dns:
      - 192.168.3.7
      - 192.168.111.1
      - 192.168.10.5
      - 192.168.10.15
    volumes_from:
      - nexus-data
    networks:
      - pic

  networks:
    pic:
      driver: bridge
      ipam:
        driver: default
        config:
          - subnet: 172.18.0.0/16
            gateway: 172.18.0.1

Я попытался с и без конфигурации ipam для сети pic, без какой-либо удачи.

Тесты и результаты: docker exec -ti nexus curl repos.private.network правильно возвращает HTML-страницу, обслуживаемую этим сервисом

docker exec -ti nexus curl another-service.private.network Возвращает curl: (6) Could not resolve host: another-service.private.network; Name or service not known curl: (6) Could not resolve host: another-service.private.network; Name or service not known В то время как curl another-service.private.network с хоста возвращает соответствующую HTML-страницу.

И "конечно" еще another-service.private.network известна на моих 4 DNS-серверах (192.168.3.7, 192.168.111.1, 192.168.10.5, 192.168.10.15).

Ответ 1

Вы не указываете, в какой среде вы используете docker-compose, например, в Mac, Windows или Unix, так что это будет немного зависеть от того, какие изменения необходимы. Вы также не указываете, используете ли вы мостовую сеть по умолчанию в Docker в созданной пользователем мостовой сети.

В любом случае, по умолчанию, Docker должен попытаться отобразить разрешение DNS с хоста Docker в ваши контейнеры. Так что если ваш Docker Host может разрешать частные DNS-адреса, то теоретически ваши контейнеры также должны это делать.

Я бы рекомендовал прочитать эту официальную документацию по Docker DNS, так как это довольно разумно. Здесь для сети мостов Docker по умолчанию, здесь для сетей мостов, созданных пользователем.

Небольшое затруднение заключается в том, что если вы используете Docker для Mac, Docker Machine или Docker для Windows, вам нужно помнить, что ваш Docker Host на самом деле является виртуальной машиной, работающей на вашей машине, а не самой физической коробкой, поэтому вам необходимо убедиться, что На виртуальной машине установлены правильные параметры разрешения DNS. Вам нужно будет перезапустить ваши контейнеры, чтобы изменения в разрешении DNS были приняты ими.

Конечно, вы можете переопределить все настройки по умолчанию, используя docker-compose. Он имеет полные параметры для явной настройки DNS-серверов, параметров поиска DNS и т.д. Например:

version: 2
services:
 application:
  dns:
   - 8.8.8.8
   - 4.4.4.4
   - 192.168.9.45

Вы найдете документацию по этим функциям здесь.