Я начал использовать Docker, и мне он нравится в основном потому, что контейнеры Docker — это своего рода легкие виртуальные машины. Но я не могу понять, как контейнеры докеров могут разрешать имена хостов друг друга. Они могут подключаться друг к другу, используя свои IP-адреса, но не используя свои имена хостов, я даже не могу редактировать /etc/hosts в контейнерах, чтобы как-то компенсировать это. Когда я перезапускаю контейнеры, они получают разные IP-адреса, и поэтому я хочу использовать имена хостов вместо IP-адресов для связи друг с другом. Допустим, я хочу запустить экземпляры Zookeeper кластера Zookeeper в контейнерах и хочу поместить имена хостов серверов Zookeeper в файлы конфигурации (zoo.cfg).
Как док-контейнеры разрешают имя хоста других док-контейнеров, работающих на том же компьютере?
Ответы (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
Возможно, стоит проверить ссылки 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. Надеюсь, это поможет!
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:
Эта корневая запись настроила общую мостовую сеть, совместно используемую несколькими док-контейнерами.