Я планирую разделить свой монолитный сервер на множество небольших контейнеров-докеров, но пока не нашел хорошего решения для «межконтейнерного взаимодействия». Это мой целевой сценарий:
Я знаю, как связывать контейнеры вместе и как открывать порты, но ни одно из этих решений меня не удовлетворяет.
Есть ли какое-либо решение для связи через имена хостов (имена контейнеров) между контейнерами, как в традиционной сети серверов?
networking
docker
Патрик Готтхард
источник
источник
Ответы:
Изменить: после Docker 1.9
docker network
команда (см. Ниже https://stackoverflow.com/a/35184695/977939 ) является рекомендуемым способом достижения этого.Мое решение - настроить dnsmasq на хосте для автоматического обновления DNS-записи: записи «A» имеют имена контейнеров и автоматически указывают на IP-адреса контейнеров (каждые 10 секунд). Автоматический скрипт обновления наклеен здесь:
Убедитесь, что ваша служба dnsmasq доступна на
docker0
. Затем запустите свой контейнер,--dns HOST_ADDRESS
чтобы использовать эту службу mini DNS.Ссылка: http://docs.blowb.org/setup-host/dnsmasq.html
источник
Новая сетевая функция позволяет вам подключаться к контейнерам по их имени, поэтому, если вы создаете новую сеть, любой контейнер, подключенный к этой сети, может обращаться к другим контейнерам по их имени. Пример:
1) Создать новую сеть
2) Подключите контейнеры к сети
или
3) Пинг контейнера по имени
См. Этот раздел документации;
Примечание. В отличие от прежних версий,
links
новая сеть не создает переменные среды и не использует переменные среды для других контейнеров.Эта функция в настоящее время не поддерживает псевдонимы
источник
docker-compose down,up,restart
?bridge
сети по умолчанию из-за обратной совместимости, но да, я согласен, он обязательно должен быть включен по умолчанию!Это должно быть то
--link
, для чего нужно , по крайней мере, для части имени хоста.С docker 1.10 и PR 19242 это будет:
(см. последний раздел ниже)
Это то, что Обновление
/etc/hosts
сведений о файлеНапример, запустите сервер LDAP:
И определите изображение для тестирования этого сервера LDAP:
Вы можете выставить
openldap
контейнер как 'internalopenldap
' внутри тестового изображения с помощью --link:Затем, если вы наберете lds, этот псевдоним будет работать:
Это вернет людей. Смысл
internalopenldap
правильно передан изldaptest
изображения.Конечно, добавит docker 1.7
libnetwork
, который предоставляет встроенную реализацию Go для подключения контейнеров. См. Сообщение в блоге .Он представил более полную архитектуру с моделью сети контейнеров (CNM).
Это обновит интерфейс командной строки Docker новыми «сетевыми» командами и задокументирует, как используется
-net
флаг « » для назначения контейнеров сетям.docker 1.10 имеет новый раздел с псевдонимом в сетевой области , который теперь официально задокументирован в
network connect
:источник
РЕДАКТИРОВАТЬ : это больше не кровотечение: http://blog.docker.com/2016/02/docker-1-10/
Оригинальный ответ
Я боролся с ним всю ночь. Если вы не боитесь передышки , последняя версия движка Docker и Docker составляют обе реализации libnetwork.
С правильным конфигурационным файлом (который должен быть помещен в версию 2) вы создадите службы, которые будут видеть друг друга. И, бонус, вы также можете масштабировать их с помощью docker-compose (вы можете масштабировать любую службу, которую хотите, которая не связывает порт на хосте)
Вот пример файла
И ссылка на эту новую версию файла создания: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
источник
Насколько мне известно, при использовании только Docker это невозможно. Вам понадобится DNS для сопоставления ip: s контейнера с именами хостов.
Если хотите нестандартное решение. Одно из решений - использовать, например, Kontena . Он поставляется с технологией наложения сети от Weave, и эта технология используется для создания виртуальных частных сетей LAN для каждой службы, и каждая служба может быть доступна
service_name.kontena.local-address
.Вот простой пример файла YAML приложения Wordpress, в котором служба Wordpress подключается к серверу MySQL с адресом wordpress-mysql.kontena.local:
источник