Docker для Laravel: як спростити середовище розробки та розгортання

Docker для Laravel

Laravel давно вважається одним із найпопулярніших фреймворків для PHP завдяки його простоті, структурі і великій спільноті. Проте одна з ключових проблем у проєктах на Laravel — це налаштування середовища, особливо якщо розробники працюють на різних операційних системах. Docker дає змогу створювати уніфіковані середовища для розробки та продакшену, значно спрощуючи життєвий цикл додатка. У цій статті розглянемо, як працювати з Docker для Laravel, з чого почати та як налагодити процес розгортання.

Чому Docker важливий для Laravel

  1. Уніфіковане середовище
    Якщо один розробник працює на Linux, інший на Windows, а третій на macOS, виникають різні нюанси налаштування PHP, бази даних і розширень. Docker виключає такі конфлікти, адже всі запускаються в однакових контейнерах.

  2. Легке масштабування
    Для продакшен-середовища можна швидко підняти кілька контейнерів з різними компонентами: Nginx/PHP-FPM, Redis, MySQL. Це робить додаток більш гнучким для навантажень і розподілення сервісів.

  3. Зручне оновлення середовища
    Якщо потрібна інша версія PHP або якесь нове розширення, змінюють Dockerfile, а потім перезбирають контейнер. Не треба ручного “відловлювання” несумісностей.

  4. CI/CD інтеграція
    Docker гарно інтегрується з інструментами безперервної інтеграції і деплою, адже один і той самий образ можна запускати в розробці, на тест-середовищі і в продакшені.

Приклад базового Docker-середовища для Laravel

Найпростіший варіант — використати офіційні образи PHP (з розширеннями) і MySQL/Redis. Але зручніше мати docker-compose.yml, де буде описано всі сервіси.

docker-compose.yml

version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: laravel-app
    container_name: laravel_app
    volumes:
      - ./:/var/www/html
    ports:
      - "8000:80"
    depends_on:
      - db

  db:
    image: mysql:8
    container_name: laravel_db
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    ports:
      - "3306:3306"
  • app: описує контейнер з додатком Laravel
  • db: контейнер з MySQL

Dockerfile

# Залежить від PHP-образу з фреймворком
FROM php:8.1-fpm

# Встановлюємо додаткові розширення (gd, pdo, etc.)
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# Виставляємо права доступу
RUN chown -R www-data:www-data /var/www/html

# За замовчуванням php-fpm буде слухати 9000 порт
EXPOSE 80
CMD ["php-fpm"]

Пояснення

  • Використовується офіційний образ php:8.1-fpm.
  • Встановлюємо необхідні розширення для Laravel (pdo_mysql, mbstring та ін.)
  • Додається composer для встановлення залежностей.
  • WORKDIR вказує, що всі операції всередині контейнера будуть у /var/www/html.

Після того, як ми маємо docker-compose.yml і Dockerfile, у корені проєкту (там, де папка з Laravel) можна запустити

docker-compose build
docker-compose up -d

Тепер у браузері можна перейти на http://localhost:8000 і побачити Laravel.

Налаштування .env Laravel для підключення до бази

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel
DB_PASSWORD=secret

Тут DB_HOST=db означає ім’я сервісу з docker-compose.

Робота з файлами і папкою проєкту

Зверніть увагу, що у docker-compose.yml використовується

volumes:
  - ./:/var/www/html

Це означає, що локальна папка відображена у контейнері як /var/www/html. Усі зміни, які ви робите локально (редагування файлів Laravel), автоматично відображаються у контейнері, тож немає потреби ребілдити контейнер.

Оптимізації

Виготовляйте окремі Dockerfile для development і production.

  • У dev-версії ми можемо робити live reload, mount локального коду.
  • У production образі додаток копіюється всередину контейнера, встановлюються залежності, і тоді вміст статичний.

Cache для композитора

Якщо залежності встановлюються часто, оптимізуйте шари Dockerfile так, щоб composer install кешувався, якщо composer.json не змінюється.

Приклад виробничого Dockerfile (Production)

FROM php:8.1-fpm as builder

RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

COPY . .
RUN php artisan config:cache

FROM php:8.1-fpm
COPY --from=builder /var/www/html /var/www/html
WORKDIR /var/www/html
CMD [\"php-fpm\"]

Структура

  1. builder створює додаток: встановлює залежності, виконує composer install.
  2. кінцевий образ містить лише результати з builder. Це зменшує розмір образу і полегшує деплой.

Переваги Docker для Laravel

  1. Узгодженість середовища.
    Не потрібно думати, у когось PHP 7.4 чи 8.1, які розширення встановлені. Все прописано у Dockerfile.
  2. Легке підключення сервісів.
    База даних MySQL, Redis, Queue — усе запускається docker-compose, ніяких конфліктів портів і версій.
  3. Масштабування.
    Коли треба запустити кілька контейнерів Laravel, зробити балансування, це робиться порівняно просто.
  4. CI/CD.
    Налаштування конвеєрів (pipeline), де на кожному етапі збирається Docker-образ, запускаються тести, а потім деплой у продакшен.

Підводні камені

  1. Продуктивність.
    На Windows чи macOS, якщо папка проєкту шариться з контейнером, швидкість файлів може бути меншою, ніж на Linux.
  2. Вчимося Docker.
    Розробникам, які ніколи не користувалися контейнерами, доведеться освоїти нові команди, принципи роботи з мережами, volume, build.\n3. Розмір образу.
    Якщо без оптимізації, образи можуть бути великі. Варто застосовувати “стислі” базові образи (наприклад, Alpine).

Висновок

Docker дає змогу зробити процес розробки Laravel проєктів більш передбачуваним і контрольованим. Замість витрачати час на ручне налаштування PHP, розширень і СУБД, ми описуємо все у Dockerfile і docker-compose.yml, а потім просто запускаємо контейнери. Це особливо корисно, коли команда розробників велика або коли потрібно швидко відтворити середовище для тестування чи продакшену. Незважаючи на початкові труднощі, переваги (універсальність середовища, масштабованість, легкість деплою) роблять Docker для Laravel гарним вибором.