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

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

2 ответа

Начиная с Docker 1.10, если вы создаете отдельную сеть докеров, 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

Возможно, стоит проверить ссылки 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. Надеюсь, это поможет!

Может зависеть от ОС контейнера, но, предположив, что контейнер работает под управлением 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:

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

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