Скажем, мы предоставляем оверлейную сеть с помощью Docker Swarm и создаем различные контейнеры со следующими именами:
Теперь, если мы попытаемся пропинговать любой контейнер из другого, произойдет сбой, потому что он не знает, как выполнить поиск IP, т.е. Алиса не знает IP Боба и так далее. Мы позаботились об этом, вручную отредактировав /etc/hosts
в каждом контейнере и введя пару имя / значение ключа IP в этом файле, но это становится очень утомительным при каждом перезапуске нашей сети. Должен быть лучший способ справиться с этим.
Например, службы, созданные с использованием стека докеров, не страдают от этой проблемы. По разным причинам мы застряли в создании контейнеров с использованием ванили docker create
. Как мы можем заставить контейнеры обнаруживать друг друга в оверлейной сети без ручного труда редактирования /etc/hosts
?
Ниже приведен подробный рабочий процесс, которому мы в настоящее время должны следовать:
- мы сначала предоставляем
docker swarm
и оверлейную сеть
- Затем для каждого контейнера мы создаем его с помощью команды
docker create
, а затем запускаем его с помощью команды docker start
. мы используем флаг --network
, чтобы прикрепить контейнер к оверлейной сети во время создания
- Затем мы используем
docker container inspect
, чтобы получить IP-адрес каждого контейнера. Это включает выполнение команд n
и запись IP-адреса.
- Затем мы регистрируемся в каждом контейнере и вручную редактируем файл
/etc/hosts
и вводим пару ключ-значение (имя, IP) других контейнеров. Таким образом, это означает необходимость ввода n*(n-1)
записей вручную при суммировании по контейнерам.
Не уверен, почему docker create
не делает все это автоматически - докер уже знает (или может знать) все IP-адреса. Контейнеры, подготовленные с использованием стека докеров, например, не должны проходить этот ручной процесс, чтобы «обнаруживать» друг друга. Причина, по которой мы не можем использовать стек Docker, заключается в следующем:
- не позволяет нам указать имя контейнера
- мы запускаем различные команды (в основном
docker cp
) перед запуском контейнера и не можем сделать это с помощью стека