Как док-контейнеры разрешают имя хоста других док-контейнеров, работающих на том же компьютере?

Я начал использовать Docker, и мне он нравится в основном потому, что контейнеры Docker — это своего рода легкие виртуальные машины. Но я не могу понять, как контейнеры докеров могут разрешать имена хостов друг друга. Они могут подключаться друг к другу, используя свои IP-адреса, но не используя свои имена хостов, я даже не могу редактировать /etc/hosts в контейнерах, чтобы как-то компенсировать это. Когда я перезапускаю контейнеры, они получают разные IP-адреса, и поэтому я хочу использовать имена хостов вместо IP-адресов для связи друг с другом. Допустим, я хочу запустить экземпляры Zookeeper кластера Zookeeper в контейнерах и хочу поместить имена хостов серверов Zookeeper в файлы конфигурации (zoo.cfg).


person Nipun Talukdar    schedule 09.10.2014    source источник
comment
Не уверен, что докер разрешает обратные вызовы для назначенных IP-адресов, тогда он может обновить DNS-сервер. Другие варианты включают в себя, что клиент отправляет обновления Dyndns, вы назначаете IP-адреса через DHCPd (который некоторые могут обновлять DNS) или вы можете проверить парк. Обычное решение — использовать порты, открытые для хоста, что каким-то образом работает для серверов со статическими слушателями.   -  person eckes    schedule 09.10.2014


Ответы (3)


Начиная с Docker 1.10, если вы создаете отдельную сеть Docker, Docker будет разрешать имена хостов внутри контейнера с помощью внутреннего DNS-сервера [1][2][3]. Вы можете изменить сетевое имя хоста, указав его с --name в файле docker run. В противном случае имя хоста будет ссылаться на идентификатор контейнера (длинный хэш из 12 символов, показанный docker container ls ).

Смотрите также:

Источники:

[1] = docker docs — встроенный DNS-сервер в пользовательских сетях

[2] = Примечания к выпуску Docker Engine — 1.10.0 (2016– 02–04) – Нетворкинг

[3] = запросы на вытягивание Docker — поставщик libnetwork

person Murmel    schedule 25.10.2017
comment
Похоже на то, что мне нужно, но не знаю, как это сделать... Не могли бы вы взглянуть на этот вопрос а мне помочь?! Спасибо! - person Cleb; 27.02.2019

Возможно, стоит проверить ссылки Docker (https://docs.docker.com/userguide/dockerlinks/< /а>). Когда вы связываетесь с запущенным контейнером, для контейнера, к которому вы хотите подключиться, добавляется запись хоста.

На своем примере они показывают

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

Как вы видите здесь, они связывают приложение, с которым они находятся в bash, с контейнером с именем db, а затем добавляется запись хоста для db с IP-адресом этого контейнера.

Таким образом, в случае запуска zookeeper вы можете просто сделать так, чтобы контейнеры, которые вы запускаете, просто ссылались на zookeeper. Надеюсь, это поможет!

person Marcus Hughes    schedule 09.10.2014
comment
То же самое говорится в документации для compsoe, но я не вижу записей хоста : docker exec -it my_container tail -20 /etc/hosts не возвращает ни одну из моих служб, определенных в моем файле компоновки. - person Munchkin; 02.09.2016

Может зависеть от ОС контейнера, но предположим, что контейнер работает под управлением Linux, вы можете проверить конфигурацию DNS следующим образом:

cat /etc/resolv.conf 

Он может вернуть что-то вроде:

nameserver 127.0.0.11
options ndots:0

/etc/resolv.conf — это стандартный файл конфигурации для DNS в UNIX-подобных ОС. В данном конкретном случае контейнер настроен на использование 127.0.0.11 в качестве DNS-сервера. Таким образом, контейнер может запросить его, чтобы определить IP-адрес другого контейнера, используя его имя хоста. Вы можете проверить, действительно ли этот хост работает, с помощью команды nslookup, например:

nslookup redis 127.0.0.11

, который свяжется с DNS-сервером 127.0.0.11 и попросит разрешить имя хоста «redis». Он может вернуть что-то вроде:

Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      redis
Address 1: 172.21.0.3 counter-app_redis_1.counter-app_counter-net 

, что будет означать, что имя хоста разрешается в ip 172.21.0.3.

В этом конкретном случае запись сервера имен была добавлена ​​с помощью следующей записи в файле конфигурации docker-compose.yml:

...
networks:
  counter-net:

Эта корневая запись настроила общую мостовую сеть, совместно используемую несколькими док-контейнерами.

person igorpcholkin    schedule 15.05.2020