Изучение kool (2 часть серии)
Все больше и больше, мы находимся, работаем с контейнерами Docker в контексте архитектур микровиссов, включающих несколько свободно связанных приложений и сервисов, а также/или проекты, состоящие из двух или более различных приложений, бегущих бок о бок, разговаривая друг с другом через Апис Как разработчики, которые работают над этими типами проектов, которые слишком хорошо знают, создавая местную среду разработки для запуска несколько Докерские приложения В то же время может быть настоящим хлопотом. Разработка каждого приложения Самостоятельно это ветер Использование Kool и Docker Compose Отказ Однако, когда вам нужно запускать несколько приложений одновременно, настроить маршрутизацию и взаимодействие между разными контейнерами, могут быть сложными.
В этом уроке мы покажем вам, как настроить локальную среду, чтобы запустить более одного приложения Docker одновременно с помощью Kool и веб-сервера Caddy. Без сомнения, это всего лишь один из нескольких способов решать для этого случая использования, но мы считаем, что это подход, который очень хорошо работает для большинства проектов.
Требования
Прежде чем начать, если вы еще этого не сделали, вам нужно Установите Docker и Kool cli Отказ Также не повредило бы быстро получить скорость с Команды Kool CLI .
kool
Это инструмент CLI, который делает локальное развитие с Docker Super легко. Kool CLI повысит ваш рабочий процесс разработки и поможет вам, и ваша команда улучшит способ разработки и развертывания облачных нативных приложений. Убедитесь, что вы всегда используете последнюю версию, запустив Kool Self-Update
Отказ
Это всегда начинается просто
У вас есть одно приложение с его составной средой Docker. Давайте назовем это Приложение 1 Отказ
$ mkdir -p ~/multiple-apps/app-1 $ cd ~/multiple-apps/app-1
Создайте два файла, которые нам нужны:
# App 1 # ~/multiple-apps/app-1/docker-compose.yml services: app: image: kooldev/php:8.0-nginx ports: - 80:80 volumes: - .:/app/public
# App 1 # ~/multiple-apps/app-1/index.php
С этими двумя файлами вы можете получить Приложение 1 вверх и работает с использованием kool start
и проверьте статус своего сервисного контейнера, используя kool статус
:
$ kool start Creating network "app-1_default" with the default driver Creating app-1_app_1 ... done $ kool status +---------+---------+---------------------------------------------+---------------+ | SERVICE | RUNNING | PORTS | STATE | +---------+---------+---------------------------------------------+---------------+ | app | Running | 0.0.0.0:80->80/tcp, :::80->80/tcp, 9000/tcp | Up 4 seconds | +---------+---------+---------------------------------------------+---------------+ [done] Fetching services status $ curl localhost Welcome to App 1!
Потрясающий! Ваш приложение
Контейнер обслуживания работает, kool статус
показывает, что порт 80 сопоставлен с вашего хоста в контейнер, а Curl localhost
Успешно возвращает вывод Приложение 1 Отказ
Но тогда он начинает становиться сложно
Поскольку ваш проект со временем развивается, вам нужно добавить второе приложение под названием Приложение 2 , который проходит рядом с Приложение 1 Отказ Другими словами, работать над проектом, Вам нужно запустить Оба приложения на в то же время Отказ
Давайте быстро настроим Приложение 2 Отказ
$ mkdir -p ~/multiple-apps/app-2 $ cd ~/multiple-apps/app-2
Еще раз, давайте создадим два необходимых вами файла (внутри каталога app-2
):
# App 2 # ~/multiple-apps/app-2/docker-compose.yml services: app: image: kooldev/php:8.0-nginx ports: - 80:80 volumes: - .:/app/public
# App 2 # ~/multiple-apps/app-2/index.php
На этот раз, когда вы пытаетесь получить Приложение 2 вверх и работает (используя kool start
), вы столкнулись с проблемой.
$ kool start Creating network "app-2_default" with the default driver Creating app-2_app_1 ... Creating app-2_app_1 ... error ERROR: for app-2_app_1 Cannot start service app: driver failed programming external connectivity on endpoint app-2_app_1 (24719704f55491122a18f051d3f1e789b6afc3f34ccf7bfe3d7eac510117ef42): Bind for 0.0.0.0:80 failed: port is already allocated ERROR: for app Cannot start service app: driver failed programming external connectivity on endpoint app-2_app_1 (24719704f55491122a18f051d3f1e789b6afc3f34ccf7bfe3d7eac510117ef42): Bind for 0.0.0.0:80 failed: port is already allocated ERROR: Encountered errors while bringing up the project.
Согласно сообщению об ошибке у вас есть конфликт порта ( Bind over 0.0.0.0:80 Не удалось: Порт уже выделен
). У вас не может быть двух разных контейнеров, связанных с одним и тем же портом на вашем хосте Отказ
Прежде чем продолжить, давайте останавливаемся Приложение 2 и Приложение 1 Контейнеры:
$ cd ~/multiple-apps/app-2 # you should already be here $ kool stop $ cd ~/multiple-apps/app-1 $ kool stop
Не так быстро!
Чтобы исправить эту ошибку, ваш первый импульс, вероятно, используется разные порты для каждой службы. Например, вы можете запустить Приложение 1 на localhost: 8081.
и Приложение 2 на localhost: 8082.
. Тем не менее, вы быстро осознаете, что это решение не является жизнеспособным, потому что он недостаточно гибок, и не предоставляет взаимодействие между приложениями по общему доке.
Прокси к спасению
Шаблон дизайна прокси обеспечивает гораздо лучшее решение для запуска нескольких приложений Docker одновременно в вашей местной среде разработки.
Добавить глобальную сеть в Docker Compose
Во-первых, вам необходимо улучшить составные среды Docker, используемые каждым из ваших приложений. Используя одну из многих лучших практик, встроенных в конфигурации Docker, включенные в Kool пресеты Давайте создадим Общая сеть между контейнерами Docker Отказ
По умолчанию все контейнеры в Docker-Compose.yml Файл будет делиться той же виртуальной сетью. Это означает, что два разных приложения не будут иметь канал связи. По этой причине предустановки Kool обычно имеют Две сети Для каждого контейнера: kool_local
и kool_global
Отказ
kool_local
это локальная сеть, которая доступна только для группы контейнеров из этого Docker-Compose.yml файл. Это то же самое, что и сеть по умолчанию (если мы не укажем сеть сами).kool_global
Глобальная сеть, созданная за пределами объема каких-либо конкретных Docker-Compose.yml файл. Это доступно в системе, и любые контейнеры, работающие на хосте, могут присоединиться к нему.
Давайте создадим внешнюю kool_global
Сеть внутри каждого составной среды Docker, и добавьте каждому приложению к нему.
# App 1 # ~/multiple-apps/app-1/docker-compose.yml services: app: image: kooldev/php:8.0-nginx expose: - 80 volumes: - .:/app/public networks: kool_global: aliases: - app-1 networks: kool_global: external: true
# App 2 # ~/multiple-apps/app-2/docker-compose.yml services: app: image: kooldev/php:8.0-nginx expose: - 80 volumes: - .:/app/public networks: kool_global: aliases: - app-2 networks: kool_global: external: true
Обратите внимание, что мы заменили Порты
Конфигурация с выставлять
Отказ Вы не хотите этого приложение
Контейнеры, связанные с хостом больше, чтобы избежать конфликта. Вместо этого вы хотите связать один контейнер к хосту, который просыпает каждый запрос внутри kool_global
Сеть на правильный контейнер обслуживания, используя свою сеть псевдоним
Отказ
псевдонимы
Ключ в контейнерной сети работает как Доменное имя Это разрешается к адресу этого контейнера при использовании в одной и той же сети. Это отличный способ нормализовать имена для сервисных контейнеров, которые нужно поговорить друг с другом.
Настроить прокси
Как упоминалось ранее, мы собираемся использовать Caddy Web Server как наш обратный прокси. Это наш первый выбор, потому что у него есть простой интерфейс конфигурации и набор богатых функций. Трафик Или Nginx тоже отлично поработает, поэтому не стесняйтесь использовать то, что вам нравится, когда вы реализуете это решение в реальном проекте.
Давайте начнем с создания CaddyFile
Файл конфигурации в новом прокси
каталог:
$ mkdir ~/multiple-apps/proxy $ cd ~/multiple-apps/proxy
# ~/multiple-apps/proxy/Caddyfile { auto_https off } http://a.localhost { reverse_proxy / http://app-1 } http://b.localhost { reverse_proxy / http://app-2 }
Обратите внимание, что мы используем приложение-1
и Приложение-2
Псевдонимы контейнерных сетей для указания в каждый пункт назначения на основе входящего Хозяин
Запрос ( A.Localhost
против B.localhost
). Вы также должны добавить эти локальные домена для вашего /etc/hosts
файл: echo "127.0.0.1 a.localhost B.localhost" | sudo tee -a/etc/hosts
.
По умолчанию Caddy пытается использовать Https
Для всех хозяев. Для этого учебника мы отключаем это. Мы охватим местное использование TLS в будущей статье.
Далее давайте создадим новый Docker-Compose.yml
Для Caddy сам:
# ~/multiple-apps/proxy/docker-compose.yml services: proxy: image: caddy:2-alpine ports: - 80:80 volumes: - ./Caddyfile:/etc/caddy/Caddyfile networks: - kool_global networks: kool_global: external: true
Вот и все. Вы закончите настройку вашего прокси.
Теперь все, что вам нужно сделать, это раскрутить ваш Приложение 1 , Приложение 2 и Прокси Контейнеры обслуживания (используя kool start
Конечно), и убедитесь, что он работает, отправив пару тестовых запросов.
# Proxy $ cd ~/multiple-apps/proxy # you should already be here $ kool start Creating proxy_proxy_1 ... done # App 1 $ cd ~/multiple-apps/app-1 $ kool start # App 2 $ cd ~/multiple-apps/app-2 $ kool start $ curl -H "Host: a.localhost" http://localhost Welcome to App 1! $ curl -H "Host: b.localhost" http://localhost Welcome to App 2!
W00T! Теперь у вас есть Оба приложения вверх и работают В то же время Отказ Вы можете получить доступ к ним, используя разные имена хостов, и они также могут общаться друг с другом.
Чтобы очистить местную среду, вам нужно будет перейти в каждый каталог ( app-1
, app-2
, а прокси
) и запустить Kool Стоп
А затем удалите каталоги, которые вы создали: RM -R ~/Множественные приложения
Отказ
Следующие шаги
Основная команда Kool уже работает над новым набором команд, чтобы сделать вышеуказанные шаги бесшовными и прозрачными, поэтому вам не нужно беспокоиться о деталях. Мы приглашаем вас на Присоединяйтесь к обсуждению и вносят вклад Отказ
Если вам нравится то, что мы делаем, пожалуйста, покажите свою поддержку Участник нас на Github Действительно
Поддержите проект kool с открытым исходным кодом
Kool является открытым исходным кодом и полностью свободно использовать. Если вы заинтересованы в том, чтобы узнать больше о проекте, пожалуйста, проверьте Kool.dev Отказ Если у вас есть вопросы, нужна поддержка или хочу принять участие, пожалуйста Присоединяйтесь к нашему слабым каналам Отказ
Изучение kool (2 часть серии)
Оригинал: «https://dev.to/kooldev/use-kool-to-run-multiple-docker-applications-at-the-same-time-in-your-local-development-environment-5ec6»