Как указать докеру использовать конфигурацию DNS хоста? - PullRequest
0 голосов
/ 10 января 2019

Я работаю за прокси компании. Из-за множества наложенных ограничений мне приходится переключаться на общедоступную сеть, когда я собираюсь создавать образы докеров (в основном образы на основе Ubuntu). Сборка выполняется на том же компьютере (таким образом, тот же dns conf).

Помимо сборки, я всегда запускаю свои контейнеры за этим прокси. Компания также (и действительно) имеет свой собственный днс.

К сожалению, я не понимаю, как правильно передать хост хосту dns в контейнеры, и не понимаю, как docker удается построить контейнеры resolv.conf.

Когда я смотрю на хост, я вижу такой конф:

$ cat /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.8.4
nameserver 10.xxx.yyy.z
search rennes.mycompany.fr

И внутри своих контейнеров я вижу:

search rennes.mycompany.fr
nameserver 127.0.0.11
options ndots:0

Что странно для меня, так это то, что в контейнере можно найти только часть конфигурации хоста ... И когда я пытаюсь получить любое имя, размещенное компанией, из контейнера, у меня возникает ошибка разрешения имени.

Но если я добавлю сервер имен resolv.conf хоста к серверу контейнера, он будет работать:

$ echo nameserver 192.168.1.1 >> /etc/resolv.conf

Итак, это действительно не способ сделать это ... но я не уверен, как мне это сделать. Я пытался добавить 'dns' к моим службам в docker-compose, но у меня не получилось (или я не так понимаю), и документация там довольно спартанская ...

Есть ли способ указать докеру использовать / поделиться конфигурацией DNS хоста? Может ли моя проблема возникнуть из-за создания образа вне сети компании?

РЕДАКТИРОВАТЬ: docker-compose.yml

version: '3.3'
services:
  my-apache:
    image: apache:latest
    ports:
      - 8088:80
    networks:
      - my-project-net
    dns: 
      - 192.168.1.1
    depends_on:
      - my-project
  my-project:
    image: my-project:latest
    networks:
      - my-project-net
    dns: 
      - 192.168.1.1

networks:
  my-project-net:
    driver: bridge

только «my-project» требуется доступ к днс компании, но я добавил днс к обоим на случай, если пропустил какую-то подсказку ...

РЕДАКТИРОВАТЬ 2: немного больше деталей и попыток

  • версия докера: 18.03.0-ce, сборка 0520e24
  • версия docker-compose: 1.18.0, сборка 8dd22a9

Имя, которое я пытаюсь найти, выглядит следующим образом:

some-pf-db.network.mycompany.fr

(модифицированный) демон настройки Docker выглядит так:

$ cat /etc/docker/daemon.json:

{
    "insecure-registries": [
        "some.test.registry.mycompany.fr:5000"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-file": "3",
        "max-size": "10m"
    },
    "dns-opts": ["ndots:15"]
}

Следуя @BMitch link , я попытался обновить демон docker (+ restart) с опциями ndots до 15 (не думайте, что мне нужно так много, но это ленивый способ!) ... и, к сожалению, это не решило проблему. Новое значение заменяет прежнее в контейнере, но оно продолжает сбой, достигая днс

не удалось перевести имя хоста "some-pf-db.network.mycompany.fr" в адрес: временная ошибка в разрешении имени

EDIT3: Я искал не тот контейнер ... итак, изменив пороговое значение для точек (ndots) до (например) 15 в пределах демона docker conf (/ etc / docker / daemon) .json) И удаление параметра "днс" из сервиса заставляет магию действовать! Теперь у меня есть доступ к моей компании DNS для имен (с большим количеством точек в них!)

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Запись 127.0.0.11 внутри контейнера ожидается, даже если вы переопределите DNS для контейнера. Это указывает на интерфейс обратной связи внутри контейнера, который имеет отображение для порта 53, чтобы вернуться к механизму докера для разрешения DNS. Вам нужно, чтобы docker выполнял DNS-разрешение, чтобы вы могли найти контейнер для контейнерных сетей с DNS для обнаружения.

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

Нам потребуются дополнительные сведения о фактической проблеме, с которой вы сталкиваетесь, но одна возможная проблема, с которой я сталкивался ранее, - это DNS, не разрешающий внешние хосты без полного имени в некоторых конкретных сценариях. Вы можете прочитать об этом в этом выпуске / теме здесь: https://github.com/moby/moby/issues/32093

0 голосов
/ 11 января 2019

если вы используете docker-compose, вам нужно добавить раздел dns в определение сервиса в файле yaml. Если вы запускаете docker непосредственно для командной строки, вы можете использовать аргумент --dns=IP_ADDRESS... для определения сервера имен вашей компании.

подробности в документации здесь: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...