Докер DNS гетаддринфо ENOTFOUND

Я работаю с docker-compose с node:4.2.1-wheezy а также dnsdock контейнеры.

я имею DOCKER_OPTS="--dns 172.17.42.1" внутри /etc/default/docker.

Когда я бегу node -e "require('dns').resolve('host_name_here')" Внутри моего контейнера node.js хост разрешается корректно через DNS-сервер 172.17.42.1.

Но когда я бегу node -e "require('dns').lookup('host_name_here')" это терпит неудачу с ENOTFOUND ошибка.

И проблема в том, что http.request использования dns.lookup вместо dns.resolve,

Документы говорят, что dns.lookup звонки getaddrinfo, И насколько я понимаю getaddrinfo кэширует /etc/resolv.conf и, возможно, он кэширует пустой /etc/resolv.conf (но cat /etc/resolv.conf печать nameserver 172.17.42.1).

Я действительно не знаю, как решить эту проблему. Что может вызвать такое поведение?

Обновление 1.

docker -v
Docker version 1.7.1, build 786b29d

docker-compose -v
docker-compose version: 1.4.2

Обновление 2.

Я обновил все до последних версий (docker 1.9.0, docker-compose 1.5.0 и узел до 5.0.0), но проблема все еще сохраняется.

Так что это docker-compose.yml, который воспроизводит проблему:

dnsdock:
  image: tonistiigi/dnsdock
  volumes:
    - /var/run/docker.sock:/run/docker.sock
  ports:
    - "172.17.42.1:53:53/udp"
  environment:
    - DNSDOCK_ALIAS=dns.org
node:
  image: node:5.0.0-wheezy
  command: node -e "setTimeout(function () { var dns = require('dns'); dns.resolve('dns.org', console.log.bind(console, 'resolve')); dns.lookup('dns.org', console.log.bind(console, 'lookup')); }, 5000)"
  dns: 172.17.42.1

Вы должны заменить 172.17.42.1 с IP вашего интерфейса docker0. setTimeout(..., 5000) необходимо, потому что node контейнер может начаться раньше dnsdock,

Это мое docker-compose up выход:

Creating test_node_1
Creating test_dnsdock_1
Attaching to test_node_1, test_dnsdock_1
dnsdock_1 | 2015/11/07 09:29:44 Added service: 3653951cff40c06c04b9ab3f5d2fc94ccc19305eaac7ba1a545ce1dbab3e3e17 {test_dnsdock_1 dnsdock 172.17.42.3 -1 [dns.org]}
dnsdock_1 | 2015/11/07 09:29:44 Added service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140 {test_node_1 node 172.17.42.2 -1 []}
node_1    | resolve null [ '172.17.42.3' ]
node_1    | lookup { [Error: getaddrinfo ENOTFOUND dns.org]
node_1    |   code: 'ENOTFOUND',
node_1    |   errno: 'ENOTFOUND',
node_1    |   syscall: 'getaddrinfo',
node_1    |   hostname: 'dns.org' }
dnsdock_1 | 2015/11/07 09:29:49 Stopped service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140
test_node_1 exited with code 0

1 ответ

Для лучшего просмотра DNS вы можете использовать сетевое наложение, как представлено в " Docker Overlay Networks: это было просто"

Он использует хранилище KV (Key/Value) на базе Consul и кластер роя, где вы можете зарегистрировать свои узлы.

Вы можете построить оверлейную сеть

eval "$(docker-machine env --swarm c0-master)"
docker network create -d overlay myStack1

И используйте его для запуска изображения:

docker run -d --name web --net myStack1 nginx
docker run -itd --name shell1 --net myStack1 alpine /bin/sh

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

Другие вопросы по тегам