Докеризация вашего PHP-приложения

Докеризация вашего PHP-приложения

23 мая 2022 г.

В отличие от других экосистем, таких как .NET или Java, в которых контейнеризация приложения для локальной разработки может показаться скорее бременем, чем функцией, когда дело доходит до PHP, это необходимость, а также долгожданный бонус очень близкого отражения производственной среды.


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


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


Обзор


Я пройду настройку всего стека, то есть PHP 8.1 с fpm, Nginx и MySQL в качестве базы данных, и в конце мы выполним базовую установку Symfony, чтобы протестировать все вместе.


Если вы не хотите просто проверить репозиторий со всей настройкой, вы можете найти его на [Github] (https://github.com/alexandrunastase/docker-php-devbox)


Настройка конфигурации docker-compose


Есть два файла, которые сообщают docker-compose, что нужно раскручивать. Первый — docker-compose.yml, второй — docker-compose.override.yml. Файл переопределения отвечает за раскрытие хоста с использованием имени хоста dockerhost. Это полезно как для отладки, так и для упрощения ссылок на другие контейнеры.


версия: '3.5'


Сервисы:


девбокс:


имя_контейнера: devbox-nginx


строить:


контекст: ./docker/nginx


докерфайл: Докерфайл


порты:


  • "9001:80"

тома:


  • .:/приложение:кэшировано

перезапуск: если не остановлен


зависит от:


  • devbox-сервис

devbox-сервис:


имя_контейнера: devbox-сервис


строить:


контекст: .


тома:


  • .:/приложение:кэшировано

  • ./docker/service/php.ini:/usr/local/etc/php/conf.d/99-app.ini

  • ./docker/service/www.conf:/usr/local/etc/php-fpm.d/www.conf

перезапуск: если не остановлен


Окружающая среда:


XDEBUG_CONFIG: ${XDEBUG_CONFIG}


APP_ENV: ${APP_ENV}


APP_DEBUG: ${APP_DEBUG}


APP_SECRET: ${APP_SECRET}


env_file:


  • .env

  • .env.местный

зависит от:


  • mysql

MySQL:


изображение: MySQL: 8.0


имя_контейнера: devbox-mysql


перезапуск: всегда


Окружающая среда:


MYSQL_ROOT_PASSWORD: корень


MYSQL_DATABASE: база данных


порты:


  • "3308:3306"

тома:


  • объем базы данных:/var/lib/mysql

тома:


объем базы данных:


водитель: "местный"


Добавление файлов Docker


Используются два Dockerfile. Один для php-fpm, другой для Nginx. Один для самого приложения — это php-fpm, и он находится в корне проекта, а другой — в docker/nginx/Dockerfile.


Файл Nginx Dockerfile просто копирует конфигурацию Nginx, определенную в default.conf, в контейнер. Конфигурация Nginx отличается от того факта, что было указано имя службы, определенной в docker-compose.


Докерфайл для Nginx:


ОТ nginx: стабильно


КОПИРОВАТЬ default.conf /etc/nginx/conf.d/default.conf


Док-файл для php-fpm:


ИЗ php:8.1-fpm-alpine


LABEL сопровождающий = "alexandrunastase@github"


LABEL description="Образ Devbox Docker"


Аргументы сборки пользователя


ARG APP_ENV="продукт"


АРГУМЕНТ ПРИЛОЖЕНИЯ_DEBUG="0"


ARG APP_LOG="php://stdout"


Переменные среды


ENV APP_ENV=${APP_ENV}


ENV APP_DEBUG=${APP_DEBUG}


ENV APP_LOG=${APP_LOG}


ENV XDEBUG_CONFIG=""


ОКРУЖАЮЩАЯ КОМПОЗИЦИЯ COMPOSER_NO_INTERACTION=1


Добавить пользователя PHP


Аргумент PHP_USER_ID=1000


Аргумент PHP_GROUP_ID=1000


ВЫПОЛНИТЬ установить -x \


&& addgroup -g $PHP_GROUP_ID -S php \


&& adduser -u $PHP_USER_ID -D -S -G php php


Установить зависимости


ВЫПОЛНИТЬ набор -ex \


&& docker-php-исходный экстракт \


&& apk добавить --update --no-cache \


${PHPIZE_DEPS} \


завиток \


Депозиты во время выполнения


icu-dev icu-libs \


libzip-dev zlib-dev \


libxml2-dev \


онигурума-дев \


&& pecl установить xdebug \


&& docker-php-ext-install intl opcache pdo_mysql zip bcmath mbstring sockets pcntl soap sockets ctype > /dev/null \


&& docker-php-ext-enable intl opcache pdo_mysql zip bcmath mbstring sockets pcntl soap sockets ctype \


&& apk-файл ${PHPIZE_DEPS} \


&& docker-php-источник удалить


Копируем файлы конфигурации


КОПИРОВАТЬ ./docker/service/www.conf/usr/local/etc/php-fpm.d/www.conf


КОПИРОВАТЬ ./docker/service/php.ini $PHP_INI_DIR/conf.d/99-app.ini


КОПИРОВАТЬ ./docker/service/xdebug.ini $PHP_INI_DIR/conf.d/docker-php-ext-xdebug.ini


Установить композитор


КОПИРОВАТЬ --from=composer:последняя /usr/bin/composer /usr/bin/composer


КОПИРОВАТЬ --chown=php . /приложение


РАБОЧИЙКАТАЛОГ /приложение


ПОЛЬЗОВАТЕЛЬ


Создание Makefile


Я нашел Makefile полезным дополнением к любой настройке docker-compose, поскольку он значительно упрощает доступ к общим командам без необходимости помнить, как контейнер был назван или необходим для поиска в истории оболочки.


При редактировании Makefile всегда используйте табуляцию вместо пробела, особенно при создании отступов для команд.


.ФОНИ: беги


бежать:


@если [ ! -e ".env.local" ]; потом\


cp .env .env.local; \


фи


@docker-compose up -d


@echo "Служба запущена на http://localhost:9001"


.ФОНИЯ: установить


установить:


@docker-compose exec --user="php" -T установка компоновщика devbox-service


.ФОНИ: стоп


останавливаться:


@docker-compose остановить


.ФОНИЯ: введите


войти:


@docker-compose exec --user="php" devbox-service /bin/sh


.PHONY: введите от имени пользователя root


введите как корень:


@docker-compose exec --user="root" devbox-service /bin/sh


.ФОНИЯ: тест


контрольная работа:


@docker-compose exec --user="php" -T devbox-service /bin/sh -c 'APP_ENV="test" ./bin/phpunit --testdox'


.ФОНИЯ: уничтожить


разрушать:


@docker-compose down --rmi local


Добавляем Symfony и все тестируем


Чтобы протестировать всю настройку, мы можем настроить приложение Symfony. Вы можете найти инструкции для этого [здесь] (https://symfony.com/doc/current/setup.html). Я использовал версию LTS, которая на момент написания была 5.4.


:::Информация


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


Настройка xDebug


Отладку можно включить, раскомментировав содержимое файла ./docker/service/xdebug.ini.


Вот шаги для настройки xDebug на PHPStorm:


  1. Выберите «Удаленная отладка PHP» в качестве интерпретатора CLI. Убедитесь, что локальный интерпретатор удален

  1. Выберите «Docker Compose» в качестве типа конфигурации и «devbox-service» в качестве службы.

  1. Жизненный цикл должен быть «Подключиться к существующему контейнеру».

Рабочая демонстрация


В docker-compose порт 9001 сопоставляется с локальным хостом, поэтому вы можете проверить, все ли работает после запуска:


заставить бежать


Чтобы настроить контейнеры:


сделать установку


установить все пакеты композитора.


Существует один вызов конечной точки http://localhost:9001/healthz, который должен возвращать код состояния 200.


Чтобы запустить тесты, вы можете запустить:


сделать тест


Чтобы запустить другие специальные команды, например, требующие другого пакета композитора, вы можете сделать:


заставить войти


Протестировано с использованием


  • Убунту 21.10

  • версия докера: 20.10.14

  • версия для создания докеров: 1.29.1

Также опубликовано [здесь] (https://alexandrunastase.com/posts/building-a-simple-php-dockerized-environment).



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE