Я имею новую установку Ubuntu 14.04 и хочу использовать Докера для выполнения моего старого материала, которому нужно 12.04. DNS внутренний Докер не работает.
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]
И конечно же, в экземпляре Докера, resolv.conf похож:
nameserver 8.8.8.8
nameserver 8.8.4.4
Я могу проверить с помощью ping-запросов обоих из тех, которые успешно из экземпляра Докера. Однако нет никакого DNS (например, ping google.com
сбои).
вывод ifconfig внутренний Докер:
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)
Теперь, что?
Когда пакет Докера Ubuntu обновил к использованию systemd, это отбросило поддержку /etc/default/docker
файл конфигурации, таким образом, начальное решение, предложенное rocketman10404, больше не будет работать (отключение dnsmasq
все еще работал бы, но это имеет оборотную сторону предотвращения Ubuntu от автоматического обновления сервера DNS).
daemon.json
файл конфигурацииНайдите сервер DNS своей сети:
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
Откройте или создайте, если это не существует, /etc/docker/daemon.json
и добавьте настройки DNS к ExecStart
строка:
# /etc/docker/daemon.json
{
"dns": ["10.0.0.2", "8.8.8.8"]
}
Перезапустите демона докера:
$ sudo service docker restart
Я записал всестороннее сообщение в блоге и также зарегистрировал ошибку об этой проблеме, если Вы хотели бы больше деталей.
(Первоначально я решил его путем открытия/lib/systemd/system/docker.service, и добавьте настройки DNS к строке ExecStart, но это плохо - мы не должны редактировать systemd файлы непосредственно.)
Я не использую докера сам, таким образом, я обычно не бодал бы - в здесь по вопросу о докере, но я просто, оказалось, читал об этом и наткнулся на некоторую документацию докера, которая, кажется, решает эту точную проблему. Суммировать...
Документация предлагает несколько обходных решений. Первое должно указать сервер DNS, который будет использоваться демоном докера для контейнеров путем добавления следующей строки к /etc/default/docker
:
docker_OPTS="--dns 8.8.8.8"
где обеспеченный DNS мог быть локальным сервером DNS, такой как 192.168.1.1 (шлюз). Затем перезапустите с
sudo restart docker
Альтернативное решение привлекает отключение dnsmasq в NetworkManager путем комментирования конфигурации в /etc/NetworkManager/NetworkManager.conf
как так:
#dns=dnsmasq
затем, перезапустите обоих
sudo restart network-manager
sudo restart docker
Вот то, как я настроил докера на своем сервере Ubuntu 14.04, работающем бездисплейный.
Я выполняю сервер Ubuntu 14.04 со следующей установленной версией докера.
#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1
Файл/etc/init/docker.io.conf и сценарий содержат следующую строку:
# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
DOCKER=/usr/bin/$UPSTART_JOB
DOCKER_OPTS=
Ответ выше помог мне найти файл выше.
Я непрокомментированный следующее в/etc/default/docker.io и добавил свой локальный сервер DNS:
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 192.168.X.X"
Перезапущенный сервис с:
sudo service docker.io restart
Работал docker run <image> /bin/bash
Никакие сообщения DNS при запуске контейнера.
Запущенный новый контейнер, установленный dnsutils.
Работал роют, и сообщение сервера является корректным локальным сервером DNS.
У меня была подобная проблема, сообщила она StackOverflow. Кажется, что я не мог запросить 8.8.8.8
сервер имен, который указан в установке Ubuntu по умолчанию Докера; однако, я мог проверить с помощью ping-запросов его. В этом случае используйте сервер DNS, который можно на самом деле запросить. Тест с
nslookup - dns.server.name
и запустите контейнер через
docker run --dns=ip.addr.of.dns
Я должен все же найти, что путь к https://askubuntu.com/q/607172/30266 получает автоволшебное решение.
Я столкнулся с этим в своей ситуации, которая является конкретно
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 по VPN tap0
адаптер.Решение:
Это, казалось бы, было бы более изящным для использования NetworkManager, и это присоединено dnsmasq
экземпляр в пути это было разработано.
Скажите Докеру использовать Ваш dnsmasq
экземпляр для DNS
Добавьте или отредактируйте файл /etc/docker/daemon.json
сказать докеру использовать docker0
адаптер моста для DNS
{
"dns": ["172.17.0.1"]
}
Настройте NM dnsmasq
экземпляр для слушания мостов Докера также, потому что по умолчанию это только слушает 127.0.1.1 - создает файл /etc/NetworkManager/dnsmasq.d/docker-bridge.conf
# Default Docker bridge
interface=docker0
# Other Docker bridges
interface=br-*
Мне не нравится грубое поведение того клиента VPN, и я довольно только использовал бы DNS в конце VPN для поисков VPN (если у Вас есть вежливый клиент VPN, который использует NetworkManager, настроенный правильно, Вы не должны будете делать этого),
resolv.conf
на подключении и теперь весь DNS проходит dnsmasq
снова)Добавьте файл конфигурации для сообщения dnsmasq
к прямым запросам DNS для Вашего домена соответственно - добавляют файл '/etc/NetworkManager/dnsmasq.d/vpn-dns.conf
server=/myprivatedomain.net/10.0.0.1
# or whatever your private DNS server is
Дополнительно, добавьте область поиска для своего домена, таким образом, можно использовать краткие названия
Перезапустите NetworkManager и докера
sudo service network-manager restart
sudo service docker restart
В этой точке Ваши контейнеры Докера должны смочь сделать nslookup
без проблем, когда Вы находитесь на VPN для доменов как внутри, так и снаружи Вашей VPN.
Можно использовать локальный сопоставитель DNS хоста (например. dnsmasq
) от Ваших контейнеров Докера, если они находятся в определяемой пользователем сети. В этом случае контейнер /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 +).