Настройка Laravel в Docker это один из самых удобных способов получить предсказуемую и повторяемую среду разработки. Вам не нужно вручную ставить PHP, MySQL, Nginx, Composer т.к. всё работает в контейнерах с минимальными усилиями.
В этой статье разберём:
структуру проекта
Dockerfile для Laravel
docker-compose с PHP-FPM, Nginx, MySQL
настройку прав, переменных окружения, сomposer
готовый Makefile, чтобы команда разработчиков могла управлять окружением одной командой.
Структура проекта
Пример структуры:
project/
├── docker/
│ ├── php/
│ │ └── Dockerfile
│ └── nginx/
│ └── default.conf
├── docker-compose.yml
├── Makefile
└── laravel-app/ # исходники проекта (или просто . , если корень = Laravel)
Dockerfile для PHP-FPM
Обычно Laravel работает на PHP-FPM + Nginx. Берём официальный PHP образ и составляем докер файл как ниже:
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
git curl zip unzip libpq-dev libonig-dev libzip-dev \
&& docker-php-ext-install pdo pdo_mysql pdo_pgsql mbstring zip
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
# Установка зависимостей
COPY ./laravel-app/composer.json ./laravel-app/composer.lock ./
RUN composer install --no-scripts --no-autoloader
# Копируем проект
COPY ./laravel-app .
RUN composer dump-autoload
# Даем права
RUN chown -R www-data:www-data storage bootstrap/cache
Конфигурация Nginx
Нужно создать файл конфигурации nginx:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
}
Базовый docker-compose.yml
Описываем 3 контейнера(php-fpm, nginx, database). База создатся автоматически с username/password из .env файла который расположен в laravel-app/.env :
version: "3.9"
services:
php:
build:
context: .
dockerfile: docker/php/Dockerfile
volumes:
- ./laravel-app:/var/www
env_file:
- ./laravel-app/.env
container_name: laravel-php
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./laravel-app:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
container_name: laravel-nginx
mysql:
image: mysql:8
restart: always
env_file:
- ./laravel-app/.env
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
ports:
- "3307:3306"
volumes:
- db_data:/var/lib/mysql
container_name: laravel-mysql
volumes:
db_data:После запуска Laravel будет доступен по адресу: http://localhost:8080
Запуск приложения
docker-compose up -dУстановка зависимостей:
docker-compose exec php composer installМиграции:
docker-compose exec php php artisan migrateГенерация ключа:
docker-compose exec php php artisan key:generateMakefile
Создайте файл Makefile в корне:
.PHONY: up down restart logs bash migrate seed fresh composer
up:
docker-compose up -d
down:
docker-compose down
restart:
docker-compose down
docker-compose up -d
logs:
docker-compose logs -f
bash:
docker-compose exec php bash
migrate:
docker-compose exec php php artisan migrate
seed:
docker-compose exec php php artisan db:seed
fresh:
docker-compose exec php php artisan migrate:fresh --seed
composer:
docker-compose exec php composer installТеперь управление окружением выглядит так:
make up- поднять проектmake down- остановить проектmake bash- войти в PHP-контейнер, после этого можно выполнять произвольные коммандыmake migrate- выполнить миграцииmake fresh- пересоздать БД
Заключение
Теперь у вас есть полный, готовый и удобный набор:
Dockerfile для PHP-FPM
Nginx конфигурация
docker-compose для полноценной разработки
Makefile - который удобен для управления