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

Докеризация приложения дает множество преимуществ. Современная микросервисная архитектура требует контейнеризации приложений. Это также минимизирует разрыв между производственной средой и средой разработки. Разработчик может запустить приложение со всеми зависимостями с помощью одной команды.

При использовании dockerize разработка на компилированном языке может столкнуться с различными проблемами. Одной из основных проблем является проверка набора изменений после незначительных изменений. Существует множество вариантов горячей перезагрузки для различных стеков, но в основном они очень медленные и глючные. Иногда наборы изменений не распространяются должным образом, что приводит к ненужным проблемам.

Кроме того, скриптовый язык, такой как PHP, не страдает от этой проблемы. До тех пор, пока файлы находятся в каталоге обслуживания apache, все изменения видны серверу apache. Короче говоря, apache порождает процесс php для определенного файла .php, указанного в пути запроса.

Итак, как мы можем воспользоваться этим при разработке с использованием контейнера docker?

Давайте начнем с того, как мы можем использовать возможности контейнеризации с помощью docker для PHP-приложений.

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

.
├── src
│   └── index.php
├── Dockerfile
└── docker-compose.yml
Вход в полноэкранный режим Выход из полноэкранного режима

Внутри index.php написан замечательный скрипт, который выглядит следующим образом:

<?php echo "Hello worldn"; ?>
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь для докеризации приложения необходим Dockerfile. Нам нужны php и apache предварительно установленный образ докера. Образ php:apache-buster — это тот образ, который мы ищем.

Используя этот образ в качестве базового, наш Dockerfile будет выглядеть следующим образом

FROM php:apache-buster

COPY ./src/* /var/www/html

CMD ["apache2-foreground"]
Вход в полноэкранный режим Выйти из полноэкранного режима

Сразу после команды базового изображения FROM мы скопировали содержимое папки src в папку /var/www/html, откуда apache обслуживает файлы при запросе.

Последняя строка фактически запускает apache на переднем плане. На самом деле я скопировал ее из базового образа php:apache-buster 😉.

Итак, определение для нашего образа готово.

Теперь время для локального файла оркестровки docker-compose.yml. Этот файл диктует конфигурацию для запуска изображения.

version: '3.2'
services:
  awesome-app:
    build:
      context: .
      dockerfile: Dockerfile
    image: awesome-app:latest
    ports:
    - 80:80
    volumes:
    - type: bind
      source: ./src
      target: /var/www/html
Войти в полноэкранный режим Выход из полноэкранного режима

Здесь объявляется служба с именем awesome-app. Эта служба будет создавать изображение, используя Dockerfile, который мы только что написали. Мы назвали образ awesome-app и пометили его latest. Открыли порт 80 для хоста, чтобы apache мог быть доступен с хоста.

Последняя часть — самая сложная, мы монтируем том, который соединяет хост ./src (наш исходный каталог) с контейнером /var/www/html (каталог, из которого работает apache). Такое монтирование тома гарантирует, что любое изменение, сделанное внутри ./src, будет замечено apache.

Теперь время для тестирования. Чтобы проверить, что все работает так, как ожидается, мы сделаем следующее

  1. Запускаем awesome-app.
  2. Проверить существующий вывод.
  3. Измените код.
  4. Проверить измененный вывод.

1. Запуск awesome-app

Для запуска моего awesome-app мы будем использовать docker-compose.

docker-compose up -d
Вход в полноэкранный режим Выйти из полноэкранного режима

Это создаст контейнер awesome-app в фоновом режиме.

2. Проверка существующего вывода

Для проверки вывода существующей кодовой базы я использую curl.

curl -i http://localhost
Войти в полноэкранный режим Выйти из полноэкранного режима
HTTP/1.1 200 OK
Date: Thu, 25 Aug 2022 19:27:35 GMT
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/8.1.9
Content-Length: 12
Content-Type: text/html; charset=UTF-8

Hello world
Войти в полноэкранный режим Выйти из полноэкранного режима

3. Измените код:

Теперь я изменю код внутри index.php.

<?php echo "My Awesome app says hello worldn"; ?>
Войти в полноэкранный режим Выйти из полноэкранного режима

4. Проверьте измененный вывод.

curl -i http://localhost
Войдите в полноэкранный режим Выход из полноэкранного режима
HTTP/1.1 200 OK
Date: Thu, 25 Aug 2022 19:37:24 GMT
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/8.1.9
Content-Length: 32
Content-Type: text/html; charset=UTF-8

My Awesome app says hello world
Войти в полноэкранный режим Выход из полноэкранного режима

Видите, это просто как локальная разработка PHP-приложения со всеми преимуществами docker.

Все приведенные выше коды доступны в моем репозитории github.

Оцените статью
devanswers.ru
Добавить комментарий