Консоль 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
Вы найдете документацию по этим функциям здесь.