Настройка Docker Compose для Nginx PHP и MariaDB в веб-приложениях

Настройте Docker Compose так, чтобы каждый контейнер выполнял свою задачу без лишних ресурсов. Для этого используйте отдельные сервисы для Nginx, PHP и MariaDB. Это упрощает управление и повышает производительность. Например, создайте файл docker-compose.yml, где каждый сервис будет иметь свою конфигурацию.

Для Nginx укажите порт 80 и свяжите его с PHP через FastCGI. В конфигурации PHP добавьте модули, необходимые для вашего приложения, такие как pdo_mysql и opcache. Это ускорит обработку запросов. MariaDB настройте с использованием переменных окружения для логина и пароля, чтобы избежать хранения чувствительных данных в коде.

Используйте volumes для хранения данных MariaDB и кода приложения. Это гарантирует сохранность данных даже после перезапуска контейнеров. Для PHP и Nginx добавьте volume с исходным кодом приложения, чтобы изменения сразу применялись без пересборки образов.

Не забудьте настроить сеть между контейнерами. Укажите общую сеть в docker-compose.yml, чтобы Nginx мог обращаться к PHP, а PHP – к MariaDB. Это исключит проблемы с подключением и упростит отладку.

Создание структуры проекта с Docker Compose

Начните с создания корневой директории проекта, например my-web-app, и внутри неё разместите файл docker-compose.yml. Это основной файл конфигурации, который определяет сервисы и их взаимодействие.

Создайте отдельные папки для каждого компонента приложения:

  • nginx – для конфигурации веб-сервера.
  • php – для файлов PHP и Dockerfile.
  • mariadb – для файлов базы данных, если требуется кастомная настройка.
  • src – для исходного кода вашего веб-приложения.

В папке nginx создайте файл default.conf для настройки виртуального хоста. Пример конфигурации:


server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ .php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

В папке php создайте Dockerfile для сборки образа с PHP. Например:


FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql
COPY src/ /var/www/html/

В файле docker-compose.yml опишите сервисы:


version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./src:/var/www/html
depends_on:
- php
php:
build: ./php
volumes:
- ./src:/var/www/html
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"

Поместите исходный код вашего приложения в папку src. После этого выполните команду docker-compose up -d, чтобы запустить контейнеры. Проверьте доступность приложения по адресу http://localhost:8080.

Определение и настройка docker-compose.yml

Создайте файл docker-compose.yml в корневой директории проекта. В этом файле определите сервисы для Nginx, PHP и MariaDB, чтобы они работали вместе. Используйте следующий пример для базовой настройки:


version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./php:/var/www/html
working_dir: /var/www/html
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpassword
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:

Убедитесь, что каждый сервис имеет правильные параметры. Для Nginx укажите конфигурационный файл и папку с HTML-файлами. PHP должен монтировать директорию с кодом приложения, а MariaDB – настраивать базу данных через переменные окружения.

Добавьте зависимости между сервисами, чтобы они запускались в правильном порядке. Например, Nginx зависит от PHP, так как он обрабатывает запросы к PHP-приложению. MariaDB запускается независимо, но PHP должен подключаться к ней после старта.

Для удобства используйте именованные тома, чтобы сохранять данные базы данных между перезапусками контейнеров. В примере выше db_data сохраняет данные MariaDB.

Проверьте конфигурацию с помощью команды docker-compose config, чтобы убедиться в отсутствии ошибок. Затем запустите контейнеры командой docker-compose up -d.

Если нужно изменить параметры, например, добавить новые переменные окружения или порты, обновите файл и перезапустите контейнеры с помощью docker-compose down и docker-compose up -d.

Организация папок для исходного кода и конфигураций

Размещайте исходный код приложения в папке src, чтобы отделить его от конфигурационных файлов и зависимостей. Это упрощает навигацию и снижает вероятность ошибок при внесении изменений. Создайте подкаталог config для хранения всех конфигураций, таких как настройки Nginx, PHP и MariaDB.

Для Docker Compose используйте папку docker, где будут храниться Dockerfile и дополнительные конфигурации для каждого сервиса. Например, создайте подкаталоги docker/nginx, docker/php и docker/mariadb. Это помогает поддерживать порядок и упрощает масштабирование проекта.

Логи и временные файлы размещайте в папке var. Это предотвращает загрязнение основного кода и упрощает очистку данных. Для хранения зависимостей PHP используйте папку vendor, которая автоматически создается Composer.

Обязательно добавьте файл .dockerignore в корень проекта, чтобы исключить ненужные файлы из Docker-образа. Укажите папки вроде vendor, var и node_modules, если они не требуются для сборки.

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

Подключение необходимых образов

Для начала создайте файл docker-compose.yml и определите сервисы для Nginx, PHP и MariaDB. Используйте официальные образы из Docker Hub, чтобы обеспечить стабильность и поддержку. Для Nginx добавьте строку image: nginx:latest, для PHP – image: php:8.2-fpm, а для MariaDB – image: mariadb:10.11. Укажите теги версий, чтобы избежать неожиданных изменений при обновлении.

Настройте параметры для каждого сервиса. Для MariaDB добавьте переменные окружения, такие как MYSQL_ROOT_PASSWORD, MYSQL_DATABASE и MYSQL_USER, чтобы автоматизировать создание базы данных и пользователя. Для PHP подключите том с вашим кодом приложения, например, ./app:/var/www/html, чтобы файлы были доступны внутри контейнера.

Для Nginx создайте конфигурационный файл и подключите его через том, например, ./nginx.conf:/etc/nginx/nginx.conf. Это позволит гибко управлять настройками сервера. Убедитесь, что Nginx и PHP работают вместе, добавив в конфигурацию Nginx директиву fastcgi_pass php:9000, где php – имя сервиса PHP в docker-compose.yml.

Проверьте, что все сервисы корректно взаимодействуют. Запустите контейнеры командой docker-compose up -d и убедитесь, что веб-приложение доступно через браузер. Если возникают ошибки, проверьте логи с помощью docker-compose logs.

Интеграция сервисов: Nginx, PHP и MariaDB

Для успешной интеграции Nginx, PHP и MariaDB в Docker Compose начните с создания файла docker-compose.yml. Определите три сервиса: nginx, php и mariadb. Убедитесь, что каждый сервис использует правильные образы и настройки.

  • Для Nginx используйте образ nginx:latest. Настройте конфигурацию через volumes, подключив файл nginx.conf.
  • Для PHP выберите образ php:fpm. Подключите папку с кодом приложения через volumes и настройте environment для работы с MariaDB.
  • Для MariaDB используйте образ mariadb:latest. Задайте переменные окружения для пользователя, пароля и базы данных.

Пример конфигурации:


version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./app:/var/www/html
depends_on:
- php
php:
image: php:fpm
volumes:
- ./app:/var/www/html
environment:
DB_HOST: mariadb
DB_USER: user
DB_PASSWORD: password
DB_NAME: app_db
depends_on:
- mariadb
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: app_db
MYSQL_USER: user
MYSQL_PASSWORD: password

Настройте Nginx для работы с PHP-FPM. В файле nginx.conf добавьте блок location для обработки PHP-запросов:


location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Проверьте подключение PHP к MariaDB. В коде приложения используйте переменные окружения для подключения к базе данных:


$db = new mysqli(
getenv('DB_HOST'),
getenv('DB_USER'),
getenv('DB_PASSWORD'),
getenv('DB_NAME')
);

Запустите контейнеры командой docker-compose up -d. Убедитесь, что все сервисы работают корректно и взаимодействуют друг с другом.

Настройка Nginx для проксирования запросов

Для проксирования запросов к PHP-приложению, создайте конфигурацию Nginx в файле nginx.conf. Укажите серверный блок, который будет перенаправлять запросы на PHP-FPM через сокет или TCP-порт.

Пример конфигурации:

server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /.ht {
deny all;
}
}

В этом примере fastcgi_pass php:9000 указывает на контейнер с PHP-FPM. Убедитесь, что имя сервиса php совпадает с именем в docker-compose.yml.

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

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;
gzip_proxied any;

Проверьте конфигурацию на ошибки командой nginx -t. Если всё в порядке, перезапустите Nginx для применения изменений.

Для балансировки нагрузки между несколькими PHP-контейнерами используйте upstream-блок:

upstream php_servers {
server php1:9000;
server php2:9000;
server php3:9000;
}

И замените fastcgi_pass php:9000 на fastcgi_pass php_servers.

Если требуется защитить соединение, настройте SSL-сертификат. Добавьте в конфигурацию:

listen 443 ssl;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

Эти параметры обеспечат безопасное соединение и корректную работу проксирования запросов.

Конфигурация PHP для обработки запросов

Установите параметр max_execution_time в php.ini на значение, достаточное для выполнения сложных запросов. Например, для приложений с интенсивной обработкой данных используйте значение 120 секунд. Это предотвратит преждевременное завершение скриптов.

Настройте memory_limit в зависимости от требований приложения. Для большинства веб-приложений подойдет значение 256M, но для ресурсоемких задач увеличьте его до 512M или выше. Убедитесь, что сервер имеет достаточно оперативной памяти для поддержки таких настроек.

Оптимизируйте обработку файлов, изменив параметр upload_max_filesize. Для приложений, работающих с большими файлами, установите значение 50M или выше. Одновременно увеличьте post_max_size, чтобы оно превышало upload_max_filesize.

Используйте opcache для кэширования скомпилированного PHP-кода. Установите opcache.enable в значение 1 и настройте opcache.memory_consumption в зависимости от размера кода. Для средних проектов подойдет значение 128M.

Проверьте параметр realpath_cache_size и увеличьте его до 4096K, если приложение использует множество файлов. Это ускорит доступ к файловой системе и снизит нагрузку на сервер.

Для обработки большого числа запросов увеличьте значение max_input_vars до 5000 или выше. Это особенно полезно для приложений с формами, содержащими множество полей.

Настройте session.gc_maxlifetime в зависимости от времени жизни сессий. Для большинства приложений достаточно 1440 секунд, но для систем с длительными сессиями увеличьте значение до 86400.

Создание и настройка базы данных MariaDB

Начните с добавления сервиса MariaDB в ваш docker-compose.yml. Укажите версию образа, например mariadb:10.6, чтобы использовать стабильную версию. Определите переменные окружения для настройки: MYSQL_ROOT_PASSWORD для пароля root, MYSQL_DATABASE для создания базы данных и MYSQL_USER с MYSQL_PASSWORD для пользователя.

Пример конфигурации:


services:
db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp_db
MYSQL_USER: myapp_user
MYSQL_PASSWORD: userpassword
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:

Используйте том db_data для сохранения данных базы между перезапусками контейнера. Это предотвратит потерю информации при обновлении или остановке контейнера.

После запуска контейнера подключитесь к базе данных с помощью команды docker exec -it [container_id] mysql -u root -p. Введите пароль root, чтобы получить доступ к консоли MariaDB. Создайте дополнительные таблицы или настройте пользовательские права, если это необходимо для вашего приложения.

Для оптимизации производительности настройте параметры MariaDB через файл конфигурации my.cnf. Смонтируйте его в контейнер, добавив в docker-compose.yml:


services:
db:
...
volumes:
- ./config/my.cnf:/etc/mysql/my.cnf

Убедитесь, что конфигурация соответствует нагрузке вашего приложения. Например, настройте innodb_buffer_pool_size для эффективного использования памяти.

Установка связи между сервисами в Docker Compose

Для корректной работы веб-приложения настройте взаимодействие между сервисами через сеть Docker. Используйте параметр depends_on, чтобы указать порядок запуска сервисов. Например, чтобы MariaDB запускалась до PHP, добавьте в конфигурацию:


services:
php:
depends_on:
- mariadb

Свяжите сервисы через имена контейнеров. Docker Compose автоматически создает внутреннюю сеть, где каждый сервис доступен по своему имени. Например, PHP может подключаться к MariaDB, используя строку подключения:


mysql:mariadb

Для настройки Nginx в качестве прокси для PHP добавьте в конфигурацию Nginx:


location ~ .php$ {
fastcgi_pass php:9000;
}

Проверьте, что все сервисы используют одну сеть. Убедитесь, что в конфигурации каждого сервиса указана общая сеть:


services:
nginx:
networks:
- app-network
php:
networks:
- app-network
mariadb:
networks:
- app-network
networks:
app-network:
driver: bridge

Используйте переменные окружения для настройки параметров подключения. Например, для MariaDB задайте логин и пароль через переменные:


environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass

Проверьте корректность настроек, запустив контейнеры и проверив логи. Используйте команду docker-compose logs для отслеживания ошибок.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии