We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Контейнеризация и оркестрация PHP‑проекта на Symfony с помощью Docker‑Swarm: сервис‑сети, secret‑менеджер и blue‑green релизы

Современная разработка веб-приложений требует высокой степени автоматизации и надежности. Контейнеризация с использованием Docker и оркестрация с помощью Docker-Swarm стали де-факто стандартом для развертывания микросервисных архитектур и сложных монолитных приложений, таких как проекты на Symfony. В этой статье мы рассмотрим, как контейнеризовать PHP-проект на Symfony, оркестровать его с помощью Docker-Swarm, реализовать безопасное управление секретами и внедрить стратегию blue-green релизов, учитывая требования российского законодательства, в частности, Федеральный закон от 27.07.2006 N 152-ФЗ “О персональных данных”.

Контейнеризация PHP-проекта на Symfony

Первый шаг – создание Dockerfile для нашего PHP-приложения. Он определяет окружение, необходимое для запуска Symfony. Важно включить в Dockerfile все зависимости, включая PHP, Composer, расширения PHP и веб-сервер (например, Nginx или Apache).

FROM php:8.2-fpm-alpine

WORKDIR /var/www/html

RUN apk add --no-cache --virtual .build-deps $PHP_BUILD_DEPS 
    && docker-php-ext-install pdo pdo_mysql mysqli 
    && apk del .build-deps

COPY composer.json composer.lock ./
RUN composer install --no-interaction --optimize-autoloader

COPY . .

EXPOSE 9000

CMD ["php-fpm"]

Обратите внимание на установку необходимых расширений PHP. Также, важно оптимизировать процесс установки зависимостей Composer для уменьшения размера образа.

Оркестрация с помощью Docker-Swarm

Docker-Swarm позволяет управлять несколькими Docker-хостами как единой системой. Для этого создается файл docker-compose.yml, который описывает сервисы, необходимые для запуска приложения. Ключевые сервисы: веб-сервер, PHP-FPM, база данных (например, MySQL или PostgreSQL) и, возможно, Redis для кэширования.

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./src:/var/www/html
    depends_on:
      - php

  php:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./src:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: symfony_db
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

docker-compose.yml определяет взаимосвязи между сервисами (depends_on) и монтирует volumes для сохранения данных и обеспечения возможности внесения изменений в код без пересборки образа.

Сервис-сети и безопасность

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

Secret-менеджер

Хранение конфиденциальной информации (пароли, ключи API, параметры подключения к базе данных) непосредственно в Dockerfile или docker-compose.yml – крайне небезопасная практика. Docker-Swarm предоставляет встроенный secret-менеджер, который позволяет безопасно хранить и передавать секреты сервисам. Секреты шифруются и хранятся в зашифрованном виде.

echo "YOUR_DATABASE_PASSWORD" | docker secret create db_password -

Затем секрет можно использовать в docker-compose.yml:

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password

secrets:
  db_password:

При использовании секретов необходимо учитывать требования законодательства о персональных данных (152-ФЗ). Секреты, содержащие персональные данные или данные, необходимые для доступа к ним, должны быть надежно защищены и доступ к ним должен быть ограничен.

Blue-Green релизы

Blue-green релизы – это стратегия развертывания, которая позволяет минимизировать время простоя и риски при обновлении приложения. Суть заключается в создании двух идентичных окружений: “blue” (текущая версия) и “green” (новая версия). После развертывания новой версии на “green” окружении, трафик переключается с “blue” на “green”. Если возникают проблемы, трафик можно быстро переключить обратно на “blue” окружение.

В Docker-Swarm это реализуется путем создания двух копий сервиса (например, web-blue и web-green) и использования балансировщика нагрузки (например, Nginx) для переключения трафика между ними. Для переключения трафика можно использовать DNS или изменение конфигурации балансировщика нагрузки. Важно автоматизировать этот процесс, чтобы избежать ошибок.

Заключение

Контейнеризация и оркестрация PHP-проекта на Symfony с помощью Docker-Swarm – это мощный инструмент для повышения надежности, масштабируемости и безопасности веб-приложений. Использование сервис-сетей и secret-менеджера позволяет создать более безопасную и изолированную среду. Blue-green релизы минимизируют риски и время простоя при обновлении приложения. При разработке и развертывании приложений необходимо учитывать требования российского законодательства, в частности, 152-ФЗ “О персональных данных”.

РыбинскЛАБ предоставляет полный спектр услуг по разработке, контейнеризации, оркестрации и развертыванию PHP-приложений на Symfony. Мы поможем вам автоматизировать процесс развертывания, обеспечить безопасность ваших данных и соответствие требованиям законодательства РФ. Свяжитесь с нами для обсуждения вашего проекта!

Материал подготовлен и отредактирован для практического применения. Перед внедрением в продакшен проверьте код и команды на своём окружении.

Поделиться материалом

Нужна сложная backend-разработка?

Проектирование архитектуры, PHP/Python backend, интеграции API, боты, автоматизация и оптимизация существующих систем.

Обсудить проект
Поддержать проект