Внедрение поддержки Docker в Symfony
14281

Внедрение поддержки Docker в Symfony


За прошедшие годы Docker стал стандартом де-факто для создания, доставки и запуска серверных приложений. Он позволяет хранить все инструкции, необходимые для создания среды, в которой будет размещаться ваше программное обеспечение, рядом с кодом, в репозитории проекта.

Мы очень рады сообщить, что после 6 лет совместной работы Symfony и API Platform теперь включают первый в отрасли набор инструментов, предназначенных для автоматического создания, управления и запуска контейнеров Docker, необходимых для ваших приложений.

Docker Compose и Dockerfile Flex Configurators


Как вы, вероятно, знаете, Symfony поставляется с удобным инструментом под названием Flex.

Flex - это плагин Composer, который позволяет легко добавлять новые функции в ваши проекты. Когда вы устанавливаете новую библиотеку PHP, Flex автоматически генерирует код и конфигурацию, необходимые для установки этой библиотеки.

И у Flex появились новые суперспособности. Теперь он может генерировать и обновлять файл docker-compose.yml для добавления сервисов, необходимых для пакетов, которые вы только что установили.

Например, чтобы использовать Doctrine ORM, вам нужна СУБД. И знаете что? При установке Doctrine (например, composer require orm) Flex теперь спросит, хотите ли вы, чтобы он обновил ваш файл docker-compose.yml. Если вы ответите "да", он автоматически добавит сервер Postgres, готовый к использованию!

Другой пример: допустим, вы используете Symfony UX Turbo и хотите воспользоваться его большими возможностями в режиме реального времени. Тогда вам нужен хаб Mercure.rocks. Symfony Flex позаботился об этом: он может автоматически добавить его в ваш файл docker-compose.yml. Запустите docker-compose и все готово!

В дополнение к конфигуратору Docker Compose был добавлен конфигуратор Dockerfile. Он способен добавить расширения PHP, необходимые для установленных вами пакетов PHP (например, pdo_pgsql), в совместимый Dockerfile.

В настоящее время следующие рецепты Flex используют эти новые конфигураторы:

PHP package Docker Compose addition Dockerfile addition
symfony/orm-pack postgres pdo_pgsql
symfony/mercure-bundle dunglas/mercure  
symfony/panther   chromedriver geckodriver
symfony/mailer schickling/mailcatcher  
blackfireio/blackfire-symfony-meta blackfire/blackfire  

Конфигуратор Docker Compose также генерирует два файла переопределения: docker-compose.override.yml содержит специфическую конфигурацию, необходимую для разработки, а docker-compose.prod.yml - конфигурацию, необходимую для производства.

Symfony CLI и Docker Compose


Symfony CLI, открытый Фабьеном во время выступления на открытии конференции SymfonyWorld, способен автоматически обнаруживать сервисы Docker Compose и автоматически настраивать ваши приложения для их использования.

Для этого Symfony CLI запрашивает API Docker Engine, чтобы найти порты, используемые контейнерами Docker, и заполняет переменные окружения, используемые приложением для подключения к ним. Благодаря сгенерированному docker-compose.override.yml, сервисы, добавленные Symfony Flex, совместимы с этой функцией.

И это еще не все: вы можете запускать несколько проектов одновременно без каких-либо конфликтов (например, с разным сервером Postgres для каждого проекта). Для этого сервисы Docker Compose в docker-compose.override.yml привязываются к случайным портам на хосте! Запустите docker-compose ps в каталоге проекта, чтобы увидеть назначенные порты.

Docker Skeleton и инсталлятор


Symfony CLI - это самый простой способ начать работу с Symfony. Но он требует локальной установки PHP, локальной установки Composer и предназначен только для разработки.

Что если вы хотите быть уверены, что все разработчики в вашей команде используют одну и ту же версию PHP? Что если вы хотите упростить процесс внедрения и не хотите, чтобы ваши разработчики устанавливали PHP или Composer локально? Что если вы хотите использовать ту же конфигурацию в системе непрерывной интеграции или даже в продакшене? Здесь на помощь приходит Symfony Docker!

Symfony Docker - это скелет, содержащий все необходимое для установки и запуска проекта Symfony. С Symfony Docker, если у вас есть рабочая установка Docker Compose, вы можете создавать новые проекты Symfony без необходимости устанавливать что-либо локально.

Symfony Docker поставляется с двумя простыми образами: PHP FPM (и CLI) и веб-сервер Caddy.

Он содержит Dockerfile и файлы docker-compose.yml, совместимые с конфигураторами Symfony Flex. Он разработан, чтобы быть простым, читаемым и не раздутым, но при этом позволяет запускать ваш проект локально, в вашем CI и в продакшене!

Как и Symfony CLI, Symfony Docker также устанавливает переменные окружения, используемые вашим проектом, чтобы обеспечить его подключение к сервисам Docker Compose, установленным конфигуратором Flex.

Поскольку Symfony Docker использует веб-сервер Caddy, сертификаты TLS генерируются и обновляются автоматически (как для localhost, так и для ваших реальных доменных имен в prod), HTTP/2 и HTTP/3 поддерживаются нативно, и вы можете установить все модули Caddy, которые захотите (мои собственные модули Mercure и Vulcain, модуль OAuth/OpenID Connect, модуль HTTP-кэша...).

Приступить к работе с Symfony Docker очень просто:

$ git clone https://github.com/dunglas/symfony-docker
$ docker-compose build --pull --no-cache
$ docker-compose up

Вот и все, Symfony установлен и ваш проект запущен. Установите Doctrine, или Blackfire, или любой другой пакет, поддерживаемый конфигураторами Docker, и необходимые сервисы и расширения PHP будут установлены автоматически!

Symfony Docker содержит дополнительные возможности, такие как возможность выбора версии Symfony для установки. Его также можно добавить в существующие проекты. Подробнее об этом читайте в документации.

Symfony Docker также является шаблоном GitHub, который вы можете использовать для загрузки своего проекта. Он содержит рабочий процесс GitHub Actions, который автоматически запускает ваши тесты с помощью предоставленных контейнеров Docker!

Symfony Docker - не единственный скелет, совместимый с новыми конфигураторами Flex. Дистрибутив API Platform (из которого был извлечен Symfony Docker) также поддерживает их!

Kubernetes


Хотя Symfony Docker (и дистрибутив API Platform) можно использовать в производстве с помощью Docker Compose, поддерживаются только однохостовые развертывания.

Этого может быть достаточно для небольших и средних проектов, но когда дела становятся серьезными, вы, вероятно, захотите использовать короля контейнерных оркестров: Kubernetes.

Образы Docker, предоставляемые Symfony Docker, были разработаны с учетом совместимости с Kubernetes. Но это еще не все! Проект API Platform предоставляет диаграмму Helm (менеджер пакетов Kubernetes) для развертывания вашего проекта на любом кластере Kubernetes одной командой!

Эта диаграмма полностью совместима с Symfony Docker (и вам не нужно использовать API Platform). Скопируйте и вставьте диаграмму в свой проект, и вуаля!