Пространство имен Docker, докер на virtualbox, зеркальное окружение - PullRequest
0 голосов
/ 06 января 2019

Давайте предположим, что я использую набор команд запуска командной строки CLI для создания целого окружения контейнеров, сетей (типа моста в моем случае) и подключения контейнеров к определенным сетям.

Все работает хорошо, пока я не хочу, чтобы на одной машине была только одна такая среда.

Но что, если я хочу иметь на той же машине среду, похожую на ту, которую я только что создал, но для другой цели (тестирование) у меня возникает проблема конфликтов имен, так как я не могу создать и запустить контейнеры и сети с одинаковым именем.

До сих пор я пытался запустить второе окружение так же, как и с первым, но с префиксом всех имен контейнеров и сетей.
Это работало, но имело недостаток: в приложении, которое выполняет все запросы к URI, были прерваны, так как они имели структуру

<scheme>://<container-name>:<port-number>

и приложению не удалось дозвониться до <prefix-container-name>.

Чего я хочу добиться, так это иметь точную копию первой среды, работающей на том же компьютере, что и вторая среда, которую я мог бы использовать для выполнения тестов приложений и т. Д.

  1. Есть ли какая-либо концепция пространств имен или что-то подобное в Docker?
    Команду, которую я мог бы использовать до запуска всех команд docker и т. Д., Которые я использую для создания среды, и у меня есть только два сценария bash, которые отличаются только командой namespace в начале?
  2. Может ли использование виртуальной машины, то есть Oracle Virtualbox, быть решением моей проблемы? Создать ВМ для второй среды? Разве это не излишество, добавит ли он дополнительный набор проблем?
  3. Возможно, существует какая-то команда --hostname для docker run, которая позволит получить доступ к контейнеру из другого контейнера с использованием этого имени? Неудачный --hostname дает возможность получить доступ к контейнеру только по этому имени из самого контейнера, но не из любого другого. Возможно, есть опция или команда, которая может создать псевдоним, виртуальный хост или любое другое волшебное имя, которое я мог бы добавить в URI приложений <scheme>://<magic-name>:<port-number>, поэтому создание второй среды с разными контейнерами и именами сетей не вызовет проблем, если magic-name доступен в сети окружения
  4. Мне нужна точная копия среды из-за тестов, которые я хочу запустить и проверить, не проваливаются ли они также на уровне зависимостей, я думаю, что это довольно простой сценарий из процесса непрерывной интеграции. Есть ли какие-то специальные решения с открытым исходным кодом для того, чего я хочу достичь? Я не использую docker composer, но использую bash-скрипт со всеми командами docker cli для запуска и запуска всего окружения.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 06 января 2019

Есть ли какая-либо концепция пространств имен или что-то подобное в Docker?

Не совсем, нет (но продолжайте читать).

Может ли использование виртуальной машины [...] решить мою проблему? ... Разве это не излишество, добавит ли он дополнительный набор проблем?

Это довольно разумное решение. Это особенно актуально, если вы хотите еще больше автоматизировать развертывание: вы должны иметь возможность имитировать запуск чистой виртуальной машины, а затем запустить на ней сценарий инициализации, а затем перенести его в реальную производственную среду. Vagrant - довольно типичный инструмент для этого. Самой большой проблемой будет подключение к сети для доступа к отдельным виртуальным машинам, и это не такая уж большая проблема.

Возможно, существует какая-то команда --hostname для docker run, которая позволит получить доступ к контейнеру из другого контейнера с использованием этого имени?

docker run --network-alias очень кратко упоминается в docker run документации и имеет этот эффект. docker network connect --alias немного больше документировано и влияет на уже созданный контейнер.

Существуют ли какие-либо решения с открытым исходным кодом для того, чего я хочу достичь?

Docker Compose в основном управляет этим для вас, если вы хотите отойти от существующего решения сценария оболочки: оно ставит префикс имени во всех создаваемых им сетях и томах и создает псевдонимы сети для каждого контейнера, соответствующего его имени в файле YAML. Если ваши тома хоста монтируются относительно текущего каталога, то этот контент тоже довольно изолирован. Единственное, что вы не можете легко сделать, это запустить каждую копию стека на отдельном порту (ах) хоста, поэтому вам нужно разрешить эти конфликты.

В Kubernetes есть концепция пространства имен, которое на самом деле является именно тем, о чем вы просите, но принятие его является существенным вложением и потребует переписывания последовательности развертывания даже больше, чем это делает Docker Compose.

...