Каким образом развернуть PHP-приложение с использованием Docker?

Можете помочь мне разобраться в процессе деплоя PHP-приложения, которое работает в Docker? У нас есть PHP-приложение, его код хранится в системе контроля версий, и оно может иметь несколько инстансов, расположенных на разных серверах. У нас также есть собственный Docker-образ, в который установлена определенная версия php-fpm и необходимые расширения PHP для работы приложения. 

Если мы хотим настроить автодеплой с использованием CI/CD инструментов, таких как Jenkins или GitLab CI/CD, правильно ли я понимаю, как должен протекать этот процесс? 

В нашем CI/CD пайплайне мы сначала выполняем checkout нужной ветки из системы контроля версий, затем создаем контейнер с PHP (код приложения добавляется в контейнер с помощью команды COPY), выполняем composer install (так как папка vendor не сохраняется в VCS), запускаем тесты и анализаторы кода, и если все проверки пройдены успешно, мы делаем docker push в какой-либо реестр (Docker Hub, GitLab и т.д.). Правильно ли я понимаю, что в реестр мы загружаем образ, который содержит не только php-fpm и его расширения, но и код приложения вместе с папкой vendor и другими зависимостями? После этого на целевых серверах мы выполняем docker pull для загрузки только что созданного образа и docker run для его запуска?
  • 14 ноября 2024 г. 14:33
Ответы на вопрос 2
Да, вы правильно понимаете общий процесс деплоя PHP-приложения с использованием Docker и CI/CD инструментов. Давайте разберем этот процесс по шагам более подробно.

### Шаги для развертывания PHP-приложения с помощью Docker и CI/CD

1. **Структура проекта**:
   Убедитесь, что у вас есть файл `Dockerfile`, который описывает, как создавать ваш образ. Пример `Dockerfile` для вашего PHP-приложения может выглядеть так:

   ```dockerfile
   FROM php:7.4-fpm

   # Установка необходимых расширений
   RUN docker-php-ext-install pdo pdo_mysql

   # Устанавливаем рабочую директорию
   WORKDIR /var/www/html

   # Копируем код приложения
   COPY . .

   # Устанавливаем зависимости через Composer
   RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
       && composer install --no-dev --optimize-autoloader
   ```

2. **Настройка CI/CD**:
   В зависимости от использованного вами CI/CD инструмента (Jenkins, GitLab CI, GitHub Actions и др.), вам нужно настроить пайплайн. Основные шаги следующие:

   - **Checkout кода**: Используйте команды, которые соответствуют вашему CI/CD инструменту, для получения последнего кода из системы контроля версий.
   
   - **Сборка образа**: Выполняйте команду для сборки Docker-образа:
     ```bash
     docker build -t myapp:latest .
     ```
   
   - **Запуск тестов и проверок**: В эти этапы включите выполнение тестов и статического анализа кода:
     ```bash
     docker run --rm myapp:latest phpunit
     ```

   - **Публикация в реестре**: Если все проверки прошли успешно, запустите команду для загрузки образа в реестр:
     ```bash
     docker login -u <username> -p <password>
     docker tag myapp:latest <registry-url>/myapp:latest
     docker push <registry-url>/myapp:latest
     ```

3. **Деплой на целевых серверах**:
   После того как образ загружен в реестр, на целевых серверах вам нужно:
   - Выполнить `docker pull` для загрузки нового образа.
   - Завершить выполнение предыдущих экземпляров приложения (если они есть).
   - Запустить новый контейнер:
     ```bash
     docker run -d --name myapp -p 80:80 <registry-url>/myapp:latest
     ```

4. **Настройки среды**:
   Не забудьте управлять настройками среды (переменные окружения, конфигурационные файлы и т.д.). Это можно сделать через `docker run` с использованием флага `-e` или с помощью файлов конфигурации (например, использовать `.env` файлы).

### Рекомендации:
- Используйте GitLab CI/CD или Jenkins для автоматизации сборки и тестирования.
- Для управления развертыванием можно использовать оркестраторы, такие как Docker Swarm или Kubernetes, если вам нужно администрировать множество экземпляров приложения.
- Подумайте о том, чтобы завершать старые контейнеры перед запуском новых, чтобы избежать конфликтов.

Таким образом, вы сможете создать эффективный процесс деплоя вашего PHP-приложения, который будет автоматически обновлять его на серверах при каждом успешном изменении в коде.
В целом все правильно. 
Насчет деплоя - есть нюансы
- как CD pipeline знает адреса серверов? В современном "облачном" окружении они часто меняются, нужен какой-то метод для их динамического получения
- как обеспечить бесперебойную работу приложения во время деплоя?

В облаках (AWS/GCP/ наверно и Yandex) есть managed services, которые сами умеют решать эти и другие (autoscaling) проблемы. В AWS это ECS, Elastic Beanstalk, AWS App Runner, managed K8S.
Похожие вопросы