Как правильно организовать разработку на Laravel + Docker?

Приветствую! Работаю над своим проектом, достаточно долго цикл моей разработки происходил по схеме "написал/обновил код -> запустил и протестировал в vagrant/homestead -> залил по ftp в production на свой vds". Знаю, ужасная схема.
Начитался статей про преимущества git, CI/CD, Docker, автоматическое тестирование и развертывание, теперь хочу использовать эти технологии и в своем проекте. С теорией всё примерно ясно, но как применять всё это на практике представляю пока что смутно. Прошел несколько getting-started гайдов по Docker, научился базовым вещам, запускать под Docker nginx со статичным веб-сайтом.
Конкретный вопрос: как должен выглядеть "правильный" ход разработки на Laravel + Docker? Мне не понятно, как использовать Docker вместе Laravel, потому что в приложении используется куча разных компонентов: nginx, php-fpm, git, composer, psql, redis, npm/yarn. Какие должны быть контейнеры для этого всего, как они должны взаимодействовать и каков должен быть итоговый результат в production? В vagrant всё это было установлено внутри одной vm, то есть напоминало vds-сервер, но в Docker, насколько я понял совсем другая философия.

Читал насчет laradock, но в статье на хабре почему-то говорят, что это не очень - есть проблемы с автоматизацией и запуском на production, не знаю, правда ли это.

Буду благодарен за ваши советы и помощь!
  • Вопрос задан
  • 4373 просмотра
Решения вопроса 2
У вас маленький проект и полноценный CI/CD к нему применить сложно - мало смысла в контейниризации, если нет необходимости скейлиться, балансировать и обеспечивать выживаемость сервиса. Разработка должна идти с использованием связки контейнеров с nginx, php-fpm, redis, postgresql и т.д. - при локальной разработке всё помещается в docker-compose.

В проде - в вашем случае можно обойтись просто docker или с использованием того же docker-compose. В больших проектах на проде будет, например, kubernetes, nomad или docker swarm. Все контейнеры деплоятся и конфигурируются единожды. Ваш CI/CD должен собирать контейнер на основе alpine и php-fpm (для PHP) или nodejs (для nodejs, соответственно) с вашим проектом, желательно в пару стейджей для минимизации размеров окончательного образа, т.к. не нужен вам в проде композер, git, yarn, npm и прочие промежуточные штуки. И уже этот минимальный контейнер уезжает на прод.
Ответ написан
@andrei_pro
Вот как пример docker-compose.yaml в корень проекта с ларой.

version: '2'
services:

  app:
    build:
      context: ./docker/services/app
      dockerfile: ./Dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www
    env_file: ./.env
    depends_on:
      - mysql
    restart: always

  routine:
    build:
      context: ./docker/services/routine
      dockerfile: ./Dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    env_file: ./.env
    depends_on:
    - app
    restart: always

  web:
    build:
      context: ./docker/services/web
      dockerfile: ./Dockerfile
    working_dir: /var/www
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes_from:
      - app

  mysql:
    image: mysql:5.7
    volumes:
      - mysql-db:/var/lib/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=rootpass"
      - "MYSQL_DATABASE=db"
      - "MYSQL_USER=user"
      - "MYSQL_PASSWORD=pass"
    restart: always
    ports:
      - 3306:3306

volumes:
  mysql-db:
    driver: local


Дальше нужно создать папки в docker/services и там папки с Dockerfile и конфигом.

Как пример app в нем композер и нода для билда (это не тру подход, но можно юзать. Нужно все в отдельные контейнеры):
FROM php:7.1-fpm

RUN apt-get update \
    && apt-get install -y \
        git gnupg ssh cron nano supervisor \
        libmcrypt-dev libfreetype6-dev libjpeg62-turbo-dev libpq-dev \
        libjpeg-dev libpng-dev zlib1g-dev libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install gd mcrypt mbstring pdo pdo_mysql pdo_pgsql zip bcmath

RUN cd ~ \
    && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
    && apt-get install -y nodejs \
    && apt-get install -y build-essential

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer


mysql:
FROM mysql

И другие контейнеры web там конфиг nginx, routine там имидж от app для выполнения тасков из очереди.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Рекомендую https://laradock.io/
Ответ написан
Комментировать
hostadmin
@hostadmin
Тоже методом тыка изучал аналогичную связку (правда с Yii2). В итоге получилась такая конфигурация:
  1. Контейнер Nginx (дефолтный)
  2. Контейнер с certbot (получать сертификаты)
  3. Контейнер PHP-FPM с запуском очередей (черзе supervisord), composer'ом
  4. Контейнер CRON для запуска всяких задач
  5. Контейнер с postfix+dkim для руления почтой
  6. Контейнер для NAT'а трафика по IPv6

Пока вся разработка летит в мастер-ветку git. Выгрузка из "разработки" на сервак происходит с помощью Deployer. В принципе, после настройки всё работает как часы.

Код лежит отдельно от контейнера. Деплоить код в контейнере это уже другой уровень (да и совсем это не стандартная практика), лично у меня пока не было необходимости.

Задача была, чтобы максимально просто можно было переехать на другой хост, с правкой одного конфига (.env файла).

ПС. Самый гемор с контейнерами, это чёртовы права на файлы между хостом и контейнером.
Ответ написан
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Поддерживаю Антона насчет https://laradock.io/
Рекомендую посмотреть/клонировать мою ветку https://github.com/dlnsk/laradock/tree/laradock_cl... (она не очень свежая). Я там сделал простенькую консольную утилиту, которая существенно упрощает запуск artisan, npm и др. в контейнере. Создал PR, но ребята что-то не чешутся (решили на Go переписать, но так ничего и не сделали), а я сижу и не жужжу... ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы