Рубрики
Uncategorized

Используйте Kool, чтобы запускать несколько приложений докера одновременно в вашей местной среде разработки

Все больше и больше мы находимся, работаем с контейнерами Docker в контексте микросервиса … Помечено с Docker, WebDev, DevOps, микросервисами.

Изучение 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»