5

У меня на хосте работает dnsmasq , и я хочу, чтобы его использовали док- контейнеры вместо серверов Google по умолчанию (8.8.8.8)

Мой хост /etc/resolv.conf выглядит следующим образом:

» cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search mydomain.net

И контейнер /etc/resolv.conf выглядит следующим образом:

root@ubuntu:/# cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search mydomain.net

nameserver 8.8.8.8
nameserver 8.8.4.4

Кажется, что docker повторно использует хост /etc/resolv.conf но отбрасывает запись 127.0.0.1 и вместо этого добавляет серверы имен Google.

Я попытался добавить запись DNS, ссылающуюся на интерфейс docker0 :

» ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:8e:65:b0:88  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:8eff:fe65:b088/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55824 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74365 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:15702804 (15.7 MB)  TX bytes:60639605 (60.6 MB)

Следующее:

docker run \
    -it \
    --name ubuntu.bionic \
    --restart always \
    --dns 172.17.0.1 \
    ubuntu:bionic

Но днс не работает

root@ubuntu:/# apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease        
  Temporary failure resolving 'security.ubuntu.com'

Как я могу создать док-контейнер для использования DNS-сервера в хост-системе?

РЕДАКТИРОВАТЬ

Похоже, мне нужно указать dnsmasq для привязки к интерфейсу docker0 :

listen-address=127.0.0.1,172.17.0.1

Мне все еще не нравится, что мне нужно дважды указывать IP-адрес интерфейса docker0 , один раз для команды docker run для каждого контейнера, который я хочу создать, а также для конфигурации dnsmasq .

EDIT2

Я могу сказать , docker использовать по умолчанию мой локальный сервер DNS (который runninng в контейнере, и достижимы в других контейнерах в интерфейсе docker0 172.17.0.1

» sudo cat /etc/docker/daemon.json
{
    "dns": ["172.17.0.1", "8.8.8.8"]
}

И затем перезапустите демон докера:

sudo service docker restart

Я все еще несколько обеспокоен тем, что docker может решить изменить IP-адрес интерфейса docker0 , и я буду вынужден перенастроить docker и dnsmasq и перестроить контейнеры.

1 ответ1

1

Вы можете использовать локальный DNS-распознаватель хоста (например, dnsmasq) из ваших контейнеров Docker, если они находятся в определенной пользователем сети. В этом случае /etc/resolv.conf контейнера будет иметь сервер имен 127.0.0.11 (он же встроенный DNS-сервер докера), который может правильно перенаправлять DNS-запросы на адрес обратной связи хоста.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Если вы используете docker-compose, он автоматически настроит сеть для ваших сервисов (с форматом файла v2+). Обратите внимание, однако, что хотя docker-compose запускает контейнеры в определенной пользователем сети, он все равно строит их в сети по умолчанию. Чтобы использовать пользовательскую сеть для сборок, вы можете указать network параметр в конфигурации сборки (требуется формат файла v3.4+).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .