
Докеризация вашего 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:
- Выберите «Удаленная отладка PHP» в качестве интерпретатора CLI. Убедитесь, что локальный интерпретатор удален
- Выберите «Docker Compose» в качестве типа конфигурации и «devbox-service» в качестве службы.
- Жизненный цикл должен быть «Подключиться к существующему контейнеру».
Рабочая демонстрация
В 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).
Оригинал