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
Другие вопросы по тегам