Как развернуть Laravel в Docker и Docker Compose

Настройка 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:generate

Makefile

Создайте файл 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 - который удобен для управления

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Как создать AI-агента на Python с OpenAI для автоматического парсинга счетов

Подробный гайд, как разработать полноценного AI-агента на Python и OpenAI API, который автоматически парсит счета (PDF, фото), вытягивает данные в структурированный JSON, валидирует их и сохраняет в CSV или базу. Плюс интеграция с Telegram-ботом для загрузки документов.

12 0 3 мин