Docker Networking - связывать или не связывать?
У нас есть тысячи модульных тестов Python, и для их эффективного выполнения мы распараллеливаем их в пакетном режиме. Каждый пакет имеет свою собственную среду Docker, состоящую из основного приложения и экземпляра mongo. Это настроить что-то вроде этого:
docker network create --driver bridge ut_network-1
docker network create --driver bridge ut_network-2
docker run -d --name mongo-unittest-1 --network ut_network-1 mongo:3.4.2
docker run -d --name mongo-unittest-2 --network ut_network-1 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} --link mongo-unittest-{%}:db python discover.py
Строка подключения: "mongodb: // db: 27017 / mydb"
{%} - это число, связанное со средой, поэтому в ut_network-1 база данных будет mongo-unittest-1. Обратите внимание на псевдоним 'db'.
Это отлично работает, но я читал, что --link будет устаревшим.
Я думал, что решение будет так же просто, как удалить --link и установить имя хоста:
docker run -d --hostname db --network ut_network-1 mongo:3.4.2
docker run -d --hostname db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py
Однако, если я сделаю это, то приложение не сможет найти экземпляр mongo. В дальнейшем:
- Я не могу использовать
--name db
потому что Docker попытается создать несколько контейнеров с именем 'db', чего он явно не может сделать (даже если они находятся в другой сети). - имя хоста по умолчанию для базы данных mongo - это первые несколько цифр идентификатора контейнера. Все мои модульные тесты получают строку базы данных mongo из файла секретов, который предполагает, что база данных называется 'db'.
- как я уже сказал, если я использую
--hostname db
основное приложение не может найти экземпляр монго. Но если я жестко закодирую идентификатор контейнера в качестве сервера, то основное приложение находит экземпляр mongo в порядке. - Я хочу сохранить псевдоним 'db', чтобы модульные тесты могли использовать один единственный источник для строки базы данных mongo, с которой мне не нужно связываться.
Документация здесь подразумевает, что я могу использовать --link.
Так я делаю это правильно? Или, если нет, как мне настроить сеть Docker таким образом, чтобы я мог создать несколько сетей и использовать псевдоним "статическое" имя хоста для "db"?
Любые советы будут высоко ценится.
Заранее спасибо!
1 ответ
Да, ссылки устарели и их следует избегать. Для обнаружения DNS я думал, что имя хоста будет работать, но я вижу те же результаты, что и вы. Вы можете использовать имя контейнера с --name db
который имеет уникальную проблему контейнера, поэтому я рекомендую против этого по тем же причинам, которые вы нашли. Лучшее решение - перейти непосредственно к цели сетевого псевдонима с --network-alias db
:
docker run -d --network-alias db --network ut_network-1 mongo:3.4.2
docker run -d --network-alias db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py