- Как установить и настроить Laravel с Docker Compose на Ubuntu 22.04?
- Первоначальный контрольный список
- Установка Docker и Docker Compose на Ubuntu 22.04
- Предлагаемая структура проекта
- Рекомендуемый Dockerfile для PHP-FPM (PHP 8.1)
- пример файла docker-compose.yml
- Конфигурационный файл Nginx (docker/nginx/default.conf)
- Подготовка кода и установка зависимостей.
- Настройка файла .env для Docker
- SSL и Let's Encrypt — два простых способа.
- Запускать при загрузке и поддерживать работу службы.
- Практические советы по безопасности
- Оптимизация производительности для производственных сред
- Рабочие в очереди и компания Horizon
- Советы по выбору местоположения и центра обработки данных
- Резервное копирование, мониторинг и журналы событий.
- Стандартная отладка
- Заключение и окончательные рекомендации
- Сопутствующие услуги
- Часто задаваемые вопросы
Как установить и настроить Laravel с Docker Compose на Ubuntu 22.04?
В этом практическом и техническом руководстве мы шаг за шагом расскажем вам о процессе установки и настройки приложения. Laravel С использованием Docker Compose На сервере Убунту 22.04 Цель этой статьи — предоставить разработчикам, командам DevOps и техническим менеджерам практические рекомендации по созданию безопасной, масштабируемой и поддерживаемой производственной среды.
Первоначальный контрольный список
Перед началом работы подготовьте следующее:
- Сервер Убунту 22.04 При наличии прав root или пользователя с правами sudo.
- Докер (стабильная версия) и Docker Compose (или используйте плагин docker compose)
- Открытые порты: 80/443 Для веб-сайта; при необходимости 3306 Или 5432 Для базы данных (желательно с ограничением по IP-адресам)
- Достаточное дисковое пространство (рекомендуется SSD) и доступ к одному из более чем... 85 точек Глобальный режим при использовании облачных сервисов.
- Доменное имя и DNS-запись, указывающая на IP-адрес сервера.
Установка Docker и Docker Compose на Ubuntu 22.04
Для установки Docker и плагина docker compose выполните следующие команды на сервере:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USERЗатем выйдите из системы и войдите снова. newgrp docker Использовать.
Для проверки установки:
docker --version
docker compose versionПредлагаемая структура проекта
Для упрощения сопровождения и разработки рекомендуется организовать папку проекта следующим образом:
project-root/docker/nginx/default.confphp/Dockerfile
src/— Код Laravel (или монтирование)docker-compose.yml.env
Рекомендуемый Dockerfile для PHP-FPM (PHP 8.1)
Файл с указанием пути docker/php/Dockerfile Создайте что-то вроде следующего примера:
FROM php:8.1-fpm
# Install required tools and extensions
RUN apt-get update && apt-get install -y \
git zip unzip libpng-dev libjpeg-dev libfreetype6-dev libonig-dev libxml2-dev \
libzip-dev libpq-dev cron curl supervisor \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql mbstring xml bcmath zip opcache \
&& pecl install redis && docker-php-ext-enable redis \
&& pecl install xdebug || true \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Create non-root user
RUN useradd -G www-data,root -u 1000 -d /home/appuser appuser
WORKDIR /var/www/html
USER appuserпример файла docker-compose.yml
Предложенная версия docker-compose.yml Для запуска приложения, веб-сервера, базы данных и Redis:
version: "3.8"
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
image: laravel_app:latest
container_name: laravel_app
restart: unless-stopped
volumes:
- ./src:/var/www/html
- ./docker/php/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
environment:
- APP_ENV=production
- APP_DEBUG=false
networks:
- laravel-net
web:
image: nginx:alpine
container_name: laravel_web
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./src:/var/www/html:ro
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs:/etc/letsencrypt
depends_on:
- app
networks:
- laravel-net
db:
image: mysql:8.0
container_name: laravel_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
networks:
- laravel-net
redis:
image: redis:6-alpine
container_name: laravel_redis
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- laravel-net
volumes:
db_data:
redis_data:
networks:
laravel-net:
driver: bridgeКонфигурационный файл Nginx (docker/nginx/default.conf)
Пример конфигурации Nginx для маршрутизации запросов к приложению PHP-FPM:
server {
listen 80;
server_name example.com;
root /var/www/html/public;
index index.php index.html;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
}Примечание: В архитектурах с обратным прокси или множеством сервисов Nginx можно разместить на уровне балансировщика нагрузки или CDN.
Подготовка кода и установка зависимостей.
Если у вас нет проекта Laravel, вы можете создать новый с помощью Composer:
composer create-project --prefer-dist laravel/laravel srcЗатем, чтобы создать и запустить контейнеры:
docker compose build
docker compose up -dДля выполнения команд Composer и Artisan внутри PHP-контейнера:
docker exec -it laravel_app bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache
exitНастройка файла .env для Docker
Пример конфигурации .env, совместимой с docker-compose:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
CACHE_DRIVER=redis
REDIS_HOST=redis
APP_URL=https://example.comSSL и Let's Encrypt — два простых способа.
Есть два простых способа включить HTTPS:
- Использование Certbot на хосте: Временно остановите Nginx, поместите выданный сертификат в папку.
./certsи прикрепить его к контейнеру. - Используя автоматизированное решение: Инструменты, такие как docker-letsencrypt-nginx-proxy-companion Или Трафик Они подходят для автоматизированного управления сертификатами.
Быстрый пример с использованием Certbot:
sudo apt install -y certbot
sudo docker compose down
sudo certbot certonly --standalone -d example.com --non-interactive --agree-tos -m [email protected]
# Copy certificates from /etc/letsencrypt/live/... to ./certs and then:
sudo docker compose up -dЗапускать при загрузке и поддерживать работу службы.
Чтобы гарантировать запуск служб после перезагрузки:
sudo systemctl enable dockerКроме того, в docker-compose из перезапуск: если не остановлено Он уже использовался. При необходимости можно создать юнит systemd для docker-compose.
Практические советы по безопасности
- Использование пользователя без прав root в PHP-контейнере (
пользователь приложения(в приведенном выше Dockerfile) - Ограничение доступа к порту базы данных с помощью брандмауэра (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enableДругие рекомендации:
- Регулярное резервное копирование тома базы данных (
db_data) и хранить его вне сервера - Включение HTTPS и HSTS
- Использование секретов или служб управления ключами для хранения паролей (секреты Docker или службы управления ключами)
- Используйте такие инструменты безопасности, как... фейл2бан А при необходимости, например, WAF. ModSecurity
- Используйте CDN или службу защиты от DDoS-атак для защиты трафика.
Оптимизация производительности для производственных сред
- Включение OPcache в
php.ini:opcache.memory_consumption=256 opcache.validate_timestamps=0 - Настройка php-fpm (pm = динамический или по запросу) и увеличение его количества.
max_childrenСогласно данным серверной памяти - Использование Redis для кэширования и управления сессиями.
- Использование CDN для статических файлов
- Горизонтальное масштабирование: запуск нескольких экземпляров сервиса приложения с использованием балансировщика нагрузки (NGINX или HAProxy).
- Используйте отдельных сотрудников и руководителей или отдельные службы для обслуживания в режиме реального времени и в очередях.
Рабочие в очереди и компания Horizon
Добавьте отдельный сервис в docker-compose для запуска обработчиков очереди. Пример:
worker:
build: ...
command: php /var/www/html/artisan queue:work --sleep=3 --tries=3
depends_on: [app, redis]
restart: unless-stoppedДля Laravel Horizon лучше всего использовать выделенный контейнер с установленными PHP и Horizon и разместить его за Nginx/authentication.
Советы по выбору местоположения и центра обработки данных
Практические советы по выбору местоположения:
- Для минимизации задержки выбирайте сервер, расположенный близко к вашим конечным пользователям или месту назначения. Поставщик услуг — это не просто поставщик услуг. 85 представительств по всему миру Да, это так.
- Для геймеров или трейдеров выбирайте местоположение с низким пингом и оптимизированной сетью BGP.
- Используйте серверы, оснащенные графическими процессорами, для обработки и рендеринга с помощью ИИ.
- Используйте серверы и CDN с защитой от DDoS-атак, чтобы противостоять им.
Резервное копирование, мониторинг и журналы событий.
- Журналы контейнеров с
docker logsДоступны; для централизованной агрегации используйте ELK или Prometheus+Grafana. - Ежедневное резервное копирование базы данных и периодическое восстановление (тестирование)
- Мониторинг ресурсов ЦП/ОЗУ, отслеживание приложений и ошибок в CI/CD.
Стандартная отладка
- Ошибка 502 Bad Gateway: Убедитесь, что php-fpm запущен в контейнере приложения и что параметр fastcgi_pass установлен на правильный адрес.
приложение:9000) чтобы указать. - Проблема с подключением к базе данных: Проверьте переменные .env, сетевые настройки Docker и журналы MySQL.
- Права доступа к файлу: В случае ошибок доступа установите права доступа к папкам storage и bootstrap/cache:
sudo chown -R 1000:1000 src/storage src/bootstrap/cacheЗаключение и окончательные рекомендации
Использование Docker Compose для запуска Laravel на Ubuntu 22.04 упрощает разработку и развертывание, делая их повторяемыми и масштабируемыми. Следуя этому руководству, вы сможете настроить безопасную, быструю и поддерживаемую производственную среду: PHP-FPM с NginxMySQL/MariaDB или PostgreSQL, Redis для кэширования и очередей, а также настройки и мониторинг SSL.
Сопутствующие услуги
Для профессиональной реализации этой архитектуры можно использовать следующие сервисы:
- Больше, чем 85 представительств по всему миру Для уменьшения задержки и приближения сервера к пользователю или месту назначения.
- Графический сервер (GPU) для вычислений и рендеринга в системах искусственного интеллекта.
- VPS для торговли с низким пингом и оптимизированной сетью BGP.
- Игровой VPS с низким пингом и защитой от DDoS-атак.
- Услуги хостинга и регистрации доменов, CDN, сетевые решения и BGP-протоколы.
- Высокопроизводительный облачный сервер и управляемое резервное копирование









