У меня установлена новая версия Ubuntu 14.04, и я хочу использовать Docker для запуска моих старых приложений, для которых требуется 12.04. DNS внутри Docker не работает.
Resolv.conf моего ноутбука выглядит так:
nameserver 127.0.0.1
Который не работает с Докером, по-видимому. Поэтому он пытается установить серверы имен на 8.8.8.8 и 8.8.4.4; когда я делаю
$ sudo docker run -i -t ubuntu /bin/bash
Это говорит:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
И, конечно же, внутри экземпляра Docker resolv.conf выглядит так:
nameserver 8.8.8.8
nameserver 8.8.4.4
Я могу успешно пропинговать оба из экземпляра Docker. Тем не менее, нет DNS (например, ping google.com
сбои).
Вывод ifconfig внутри Docker:
eth0 Link encap:Ethernet HWaddr aa:e9:9f:83:9d:92
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:738 (738.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Что теперь?
источник
Сам я не пользуюсь докером, поэтому обычно я бы не стал задавать вопросы о докере, но я случайно прочитал об этом и наткнулся на какую-то докерскую документацию, которая, похоже, решает эту проблему . Подводить итоги...
Документация предлагает несколько обходных путей. Первый - указать DNS-сервер, который будет использоваться демоном docker для контейнеров, добавив следующую строку в
/etc/default/docker
:где предоставленный DNS может быть локальным сервером DNS, таким как 192.168.1.1 (шлюз). Затем перезапустите с
Альтернативное решение включает отключение dnsmasq в NetworkManager, закомментировав конфигурацию
/etc/NetworkManager/NetworkManager.conf
следующим образом:затем перезапустите оба
источник
/etc/default/docker
больше не действует. Посмотрите мое решение о том, как решить эту проблему в мире post-init.d / upstart./etc/NetworkManager/NetworkManager.conf
не существует в Ubuntu 18.04 LTS. : /systemd-resolved
по умолчанию действует как кеширующий DNS-сервер и это вызываетWARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.
проблему (настройки Ubuntu 16.04 не включают его по умолчанию). Обходной путь должен либо отключить,systemd-resolved
либо использовать--dns
опцию при запуске контейнера, как указано в основном ответе.Я столкнулся с этим в моей ситуации, которая конкретно
npm install
из пользовательского хранилища в VPN внутри контейнера.npm
не может выполнить успешный поиск DNSUbuntu по умолчанию использует
dnsmasq
запущенный NetworkManager для кэширования DNS-запросов и настраивает/etc/resolv.conf
указание на этот экземпляр на127.0.1.1
/etc/resolv.conf
который перезаписывает конфигурацию NetworkManager./etc/resolv.conf
по умолчанию скрывает ваш контейнерdnsmasq
ситуации.docker0
сетевом мосту до DNS-серверов черезtap0
адаптер VPN .Решение :
Казалось бы, было бы более элегантно использовать NetworkManager и его встроенный
dnsmasq
экземпляр в том виде, как он был спроектирован.Скажите Docker использовать ваш
dnsmasq
экземпляр для DNSДобавьте или отредактируйте файл,
/etc/docker/daemon.json
чтобы указать докеру использоватьdocker0
мостовой адаптер для DNSСконфигурируйте
dnsmasq
экземпляр NM для прослушивания мостов Docker, потому что по умолчанию он слушает только 127.0.1.1 - создать файл/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
Мне не нравится грубое поведение этого VPN-клиента, и я бы предпочел использовать DNS на стороне VPN только для поиска VPN (если у вас вежливый VPN-клиент, который правильно использует NetworkManager, вам не придется этого делать )
resolv.conf
при подключении, и теперь весь DNSdnsmasq
снова проходит )Добавьте файл конфигурации, чтобы указать,
dnsmasq
правильно ли направлять DNS-запросы для вашего домена - добавьте файл `/etc/NetworkManager/dnsmasq.d/vpn-dns.confПри желании добавьте поисковый домен для своего домена, чтобы вы могли использовать короткие имена
Перезапустите NetworkManager и Docker
На этом этапе ваши контейнеры Docker должны быть в состоянии обходиться
nslookup
без проблем, когда вы находитесь в VPN, для доменов как внутри, так и вне вашей VPN.источник
cannot unmarshal string into Go value of type []string
при перезапуске службы Docker.Вот как я настроил докер на моем сервере Ubuntu 14.04, работающем без головы.
Я работаю на сервере Ubuntu 14.04 со следующей установленной версией докера.
Файл /etc/init/docker.io.conf и скрипт содержат следующую строку:
Ответ выше помог мне найти файл выше.
Я раскомментировал следующее в /etc/default/docker.io и добавил свой локальный DNS-сервер:
Перезапустил сервис с:
Ран
docker run <image> /bin/bash
Нет сообщений DNS при запуске контейнера.
Запустил новый контейнер, установил dnsutils.
Запустил dig, и сообщение сервера является правильным локальным DNS-сервером.
источник
У меня была похожая проблема, я сообщил об этом в StackOverflow . Похоже, что я не смог запросить
8.8.8.8
сервер имен, который указан в стандартной установке Ubuntu Docker; однако, я мог бы пинговать это. В этом случае используйте DNS-сервер, который вы можете запросить. Тест си запустить контейнер через
Мне еще предстоит найти способ на https://askubuntu.com/q/607172/30266 найти автоматическое решение.
источник
Вы можете использовать локальный DNS-распознаватель хоста (например
dnsmasq
) из ваших контейнеров Docker, если они находятся в определенной пользователем сети . В этом случае у контейнера/etc/resolv.conf
будет сервер имен127.0.0.11
(он же встроенный DNS-сервер докера ), который может правильно перенаправлять DNS-запросы на петлевой адрес хоста.Если вы используете
docker-compose
, он автоматически настроит сеть для ваших контейнеров (с форматом файла v2 + ). Однако обратите внимание, что, хотяdocker-compose
контейнеры запускаются в определенной пользователем сети, они все равно строят их в сети по умолчанию . Чтобы использовать пользовательскую сеть для сборок, вы можете указать этотnetwork
параметр в конфигурации сборки (требуется формат файла v3.4 + ).источник