docker laravel nginx php mysql
Настраиваем Laravel в контейнере Docker
Сегодня я расскажу вам, как сделать своё первое приложение Laravel в контейнере Docker.
Необходимые условия
Шаг 1. Установка Laravel
Создаём приложение Laravel при помощи команды composer create-project
Переходим в каталог проекта
Прописываем разрешение на запись для папки storage, и папки cache внутри папки bootstrap.
Затем используем образ Docker composer, чтобы смонтировать каталоги, нужные для Laravel, и чтобы избежать глобальной установки Composer.
Шаг 2. Создание файла Docker Compose
Для веб-сервера я использовал порты 8080 и 844, так как у меня уже есть на компьютере установленный Apache. И я использовал порт 33061 для MySQL — уже есть установленный сервер MySQL.
Шаг 3. Сохранение данных
Я использовал тома и монтирование для хранения базы данных, файлов приложения и конфигурации.
В переменной db файла docker-compose.yml задан том под именем dbdata для хранения базы данных MySQL.
Том dbdata хранит содержимое папки var/lib/mysql внутри контейнера. Это позволяет остановливать и перезапускать службу db без потери данных.
В конце файла compose добавлено определение тома dbdata:
Добавим монтирование файлов конфигурации MySQL в службу db.
Добавим монтирование к сервису webserver. Их будет два: один для кода вашего приложения, а другой для конфигурации Nginx.
И, наконец, добавим монтирование к службе app для файлов конфигурации и кода приложения:
Служба app монтирует папку laradock, содержащую код приложения в папку /var/www в контейнере.
В итоге docker-compose.yml должен выглядеть так:
Шаг 4. Создание Dockerfile
Устанавливает базовый образ и задает необходимые команды и инструкции.
Шаг 5. Настройка PHP
Для настройки PHP создается файл local.ini.
Я добавил следующие настройки в этот файл.
Это файл, который я подмонтировал к /usr/local/etc/php/conf.d/local.ini внутри контейнера в шаге 2.
Шаг 6. Настройка NGINX
Для настройки Nginx я создал файл app.conf в папке nginx/conf.d
Шаг 7. Настройка MySQL
Для настройки MySQL был создан файл my.cnf внутри папки mysql.
Добавляем следующий код в my.cnf для того, чтобы включить логи и указать их местоположение.
Шаг 8 — Запуск контейнеров
Я определил все сервисы в файле docker-compose и создал файлы конфигурации для этих сервисов. Теперь я запускаю контейнеры командой:
Она загружает все необходимые образы Docker. После этого я просматриваю все запущенные контейнеры и их состояние, используя команду:
Шаг 9. Создание пользователя MySQL
Чтобы создать нового пользователя, запустите оболочку bash для контейнера db:
Затем создаю пользователя и даю ему все привилегии.
Сбрасываю привилегии для применения изменений.
Шаг 10. Обновление настроек окружения
Отредактируем настройки Laravel.
Обновим учетные данные базы данных и URL приложения.
Шаг 11. Перенос базы данных
Теперь у нас есть доступ к нашему приложению Laravel по адресу http://0.0.0.0:8080/
Автор: Sreejith Ezhakkad
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
Laravel + Docker: наш успешный опыт использования
О чем эта статья
Какие задачи стояли перед нами
Бывает так, что к существующей команде подключается новый разработчик. Чтобы он смог начать выполнять задачи (проще говоря, писать код и проверять свою работу), мало получить исходники. Нужно окружение, которое включает в себя web-сервер, php компилятор и базу данных. Это минимальный набор. В зависимости от проекта в окружение могут входить:
Для решения задачи был выбран Docker. Пожалуй, основная причина это то, что он легко вписался в существующую инфраструктуру. Он прекрасно работает на Linux, а большинство наших разработчиков на этой ОС.
Laravel предоставляет собственное решение для организации локального окружения под название Homestead. Это набор конфигов и скриптов для Vagrant, с помощью которых нужное ПО разворачивает в виртуальной машине VirtualBox. Но описание Homestead выходит за рамки данной статьи.
Проект Laradock
В начале этот проект был нацелен исключительно на запуск Laravel на Docker, что и отражено в его названии. Но по мере роста популярности в php сообществе Laradock стал поддерживать другие php-проекты: Symfony, CodeIgniter, WordPress, Drupal. Проект действительно популярный, активно поддерживается и развивается:
Laradock это набор предварительно настроенных, независимых Docker образов, которые можно подключать исходя из требований вашего проекта. Отлично документирован и предельно прост в использовании. Чтобы запустить компоненты, просто перечисляем их:
Замечание: нет необходимости в явном указании php-fpm, так как при запуске web server контейнеров php-fpm контейнер запускается автоматически.
В репозитории более 48 контейнеров, среди которых:
Требования и начальные условия
Архитектура git репозиториев: основной проект и Laradock
Laradock может использоваться в двух вариантах:
Мы всегда используем первый вариант: один проект – один laradock. Именно такой подход обеспечивает гибкость и независимость одного проекта от другого.
Второй важный вопрос: создавать один общий репозиторий или два отдельных? Другими словами, нужно ли добавлять файлы laradock в основной репозиторий с проектом? Ответ – нужно, но в виде подмодуля к основному репозиторию. Docker-окружение это вспомогательная часть проекта и она требуется не всегда. Например на staging и production серверах в нем нет необходимости. При организации деплоя через git, файлы окружения туда не попадут.
Имя директории с окружением
По-умолчанию в именах контейнеров в качестве суффикса используется имя текущей директории: laradock_nginx_1, laradock_mysql_1 и т.п. Чтобы избежать путаницы данных внутри томов, необходимы уникальные названия каталогов для ваших окружений. Этого легко добиться, если придерживаться выбранной нами схемы: добавлять название проекта в имя каталога с окружением, например:
Запуск одного сайта
С чего мы начинаем запуск сайта?
Как мы упоминали в третьей главе, для создания окружения мы используем Laradoc.
Процесс запуска состоит из этапов настройки среды окружения и laravel-приложения.
Настройки проекта
В составе laradoc есть файл примера конфигурирования окружения. Мы создаём его копию для своего проекта
Запуск и остановка приложений окружения производятся командами docker-compose
По необходимости можно в команде запуска вызвать загрузку нужные сервисов. Например, так буду загружены три дополнительных сервиса:
Можно убрать эту команду в отдельный shell-скрипт, чтобы не вводить каждый раз вручную.
Скрипт запуска можно назвать “start.sh”, или как вам удобно:
Скрипт остановки сервисов можно назвать “stop.sh”, или “down.sh”:
Инициализация проекта
Переход в среду контейнера выполняется командой
Ошибки при разворачивании
При установке Laradoc в среде linux может возникнуть проблема с правами доступа к файлам.
В таком случае у файлов может оказаться неверный владелец, или недостаточные права доступа.
/var/www/vendor does not exist and could not be created
The stream or file «/var/www/storage/logs/laravel.log» could not be opened: failed to open stream: Permission denied
Причина ошибки в том, что в примере конфигурации среды docker жёстко указывается ID Пользователя и Группы пользователей, по умолчанию — 1000 и 1000 соответственно.
Если же в нашей unix-системе эти ID уже заняты другими сущностями, то требуется вручную отредактировать конфигурацию.
Порядок устранения ошибки
Проверяем пользователя и группу у директорий:
Владельцы файлов и каталогов (Пользователь и Группа пользователей) должны быть laradock laradock.
Если вместо laradock:laradock владелец и группа обозначены цифрами (1001:1001, 1001:13002 и подобные сочетания), то требуется внести правки в файлы настроек.
Если ID вашего Пользователя и Группы пользователей (/etc/passwd, /etc/group) не совпадают с указанными, то, для корректной работы, нужно внести правки в следующие файлы:
/laradock/php-fpm/Dockerfile*, в строке
заменить 1000 на ID пользователя
/laradock/.env в строках
WORKSPACE_PUID — указать ID вашего пользователя, WORKSPACE_PGID — ID группы пользователей
/laradock/workspace/Dockerfile*, в строках
ARG PUID=10315
ARG PGID=10004
PUID — ID пользователя, PGID — ID группы пользователей
После внесения правок заново пересобрать workspace и php-fpm и затем запустить контейнер:
Если вы столкнулись с такой проблемой, то нужно проверить и права доступа к каталогам фреймворка Laravel. Устанавливаем права доступа на каталоги, для которых необходимы права на запись:
SSL сертификаты и https
Скорее всего ваш сайт в production будет работать по безопасному протоколу. Имеет смысл и локальную разработку вести на https. Это не очень сложно сделать, нужен SSL сертификат и небольшие настройки. Подробнее описано в этой статье Как выпустить самоподписанный SSL сертификат.
Запуск нескольких сайтов
Итак, все проекты работают по схеме “Один Laradock – один проект”. Но один проект это не обязательно один сайт. Иногда нужно запустить несколько сайтов одновременно, потому что они будут взаимодействовать между собой.
В этом случае два laradock одновременно не запустить, потому что в каждом из них запущен web-сервер, который слушает 80-ый порт – получаем конфликт. Но у нас есть доступ к конфигам nginx, давайте настроим его.
Но сначала замечание об архитектуре и git-репозиториях. В случае нескольких сайтов, используем структуру каталогов из второго варианта:
Git-репозиторий с laradock больше не подмодуль другого репозитория, а становится полностью самостоятельным.
Настройка web-сервера будет показана на примере nginx. В каталоге laradock переходим в nginx/sites. Видим default.conf и несколько *.conf.example файлов. На основе default.conf или файлов примеров создаем конфигурации для сайтов.
Обратите внимание на document root. По умолчанию директива root выглядит так:
Настроим crontab, чтобы планировщик laravel мог корректно работать. Для этого в файле workspace/crontab/laradock добавим пути:
Для успешной коммуникации сайтов внутри контейнеров, добавим алиасы. В файле docker-compose.yml находим раздел
и добавляем алиас на каждый домен:
Это все, что нужно сделать для запуска проекта с несколькими доменами. За рамками статьи остается вопрос организации https для нескольких доменов. Все по аналогии с организацией ssl для одного домена, который описан в разделе выше. Добавьте комментарий, если возникнут сложности, я отвечу на него или опишу особенности в отдельной статье.
Дополнительные возможности
В пространстве окружения Docker возможно настроить необходимые нам приложения. В базовую конфигурацию Laradoc уже входят пакеты приложений:
| Сервер веб-приложений | Apache2, Caddy |
| Кэширование веб-приложений | Nginx, Varnish |
| Базы данных и кэширующие сервисы | Mongo, Redis, Mssql, Mysql, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike |
| Веб-интерфейсы к базам данных | Adminer, PhpMyAdmin |
| Балансировщик нагрузки | Haproxy |
| Программирование, программные оболочки и фреймворки | Php, Python, Symfony, Laravel, Node |
| Утилиты | Php, Python, Symfony, Laravel, Node |
| Менеджер пакетов | Yarn, Composer |
| Средство тестирования | Jenkins |
| Средство конфигурирования инфраструктурой приложения | Terraform |
Кратко рассмотрим самые упоминаемые приложения.
Механизм обмена сообщениями между приложениями. Разработчик этого пакета определяет его назначение так: «менеджер очередей» (queue manager), «брокер сообщений» (message broker) или «очереди сообщений» (message-queueing).
Сообщение может содержать любой набор данных.
В сценарии работы с менеджером очередей сообщение от одного приложения — отправителя — сохраняется до тех пор, пока другое приложение (получатель), не подключиться и не заберёт (получит) сообщение из очереди.
Создание кэша данных в оперативной памяти. Может, также, использоваться в качестве хранилища данных наряду с сервером баз данных, либо заменяя его.
Redis поддерживает строки, списки, множества, упорядоченные множества и хэш-таблицы.
Основной недостаток редис — потеря данных в случае очистки оперативной памяти, при перезагрузке ОС или при выключении оборудования. Разработчики редис предусмотрели подобный сценарий: в режиме AOF (Append Only File) данные добавляются в дисковый файл каждую секунду.
Основное преимущество редис — максимально быстрый доступ к данным со скоростью обращения к ОЗУ.
Ссылки на материалы
Заключение
Выбрав для веб-разработки решение Laravel + Docker, мы выиграли самый ценный приз: время.
Следуя сценарию разработки в WAMP или LAMP, нам приходилось тратить время
бесполезно и в никуда.
И WAMP, и LAMP требует от php-разработчика определённого уровня квалификации в областях, которые не связаны напрямую с веб-разработкой: конфигурирование веб-сервера, настройка параметров php и т. п.
Использование Laradoc позволяет нам, однажды создав всю среду проекта, в минимальный срок развернуть его на новом рабочем месте. И сразу же приступить к работе.
В заключении, отметим преимущества использования Laradoc:
Настройка Laravel, Nginx и MySQL с Docker Compose
Published on January 7, 2020
Автор выбрал фонд FreeBSD Foundation для получения пожертвования в рамках программы Write for DOnations.
Введение
В последние несколько лет Docker стали часто использовать для развертывания приложений, поскольку он упрощает запуск и развертывание приложений в виртуальных контейнерах. При использовании набора приложений LEMP, например в системе с PHP, Nginx, MySQL и Laravel, Docker может значительно ускорить процедуру настройки.
В этом обучающем модуле вы создадите веб-приложение с помощью системы Laravel, используя Nginx в качестве веб-сервера и MySQL в качестве базы данных. Все это будет делаться в контейнерах Docker. Вы зададите полную конфигурацию приложения в файле docker-compose вместе с файлами конфигурации для PHP, MySQL и Nginx.
Предварительные требования
Перед началом работы вам потребуется следующее:
Шаг 1 — Загрузка Laravel и установка зависимостей
На первом шаге мы загрузим последнюю версию Laravel и установим зависимости проекта, включая Composer, диспетчер пакетов PHP на уровне приложения. Мы установим эти зависимости с помощью Docker, чтобы не выполнять глобальную установку Composer.
Перейдите в домашний каталог и клонируйте последнюю версию Laravel в каталог с именем laravel-app :
Перейдите в каталог laravel-app :
Затем смонтируйте образ composer из Docker в каталоги, которые нужны для вашего проекта Laravel, чтобы избежать издержек глобальной установки Composer:
/ laravel-app будет скопировано в контейнер, а содержимое создаваемой Composer внутри контейнера папки vendor будет скопировано в текущий каталог.
В заключение установите в каталоге проекта такой уровень разрешений, чтобы ее владельцем был пользователь без привилегий root:
Это будет важно, когда вы будете записывать Dockerfile для образа вашего приложения на шаге 4, поскольку позволит работать с кодом прложения и запускать процессы в контейнере, не имея привилегий root.
Теперь вы разместили код приложения и можете переходить к определению служб с помощью Docker Compose.
Шаг 2 — Создание файла Docker Compose
Построение приложений с помощью Docker Compose упрощает процесс настройки и контроля версий в вашей инфраструктуре. Чтобы настроить наше приложение Laravel, мы создадим файл docker-compose с определением служб веб-сервера, базы данных и приложения.
Сюда включены следующие службы:
Каждое свойство container_name определяет имя контейнера, соответствующее имени службы. Если вы не определите это свойство, Docker будет присваивать каждому контейнеру имена, состоящие из имени исторической личности и случайного слова, разделенных символом подчеркивания.
Теперь посмотрим, как добавлять тома и привязывать смонтированные образы к определениям служб для постоянного сохранения данных приложения.
Шаг 3 — Постоянное сохранение данных
В Docker имеются мощные и удобные средства для постоянного сохранения данных. В нашем приложении мы будем использовать тома и монтируемые образы для постоянного сохранения файлов базы данных, приложения и конфигурации. Тома обеспечивают гибкость резервного копирования и сохранение по прекращении жизненного цикла контейнера, а привязываемые монтируемые образы упрощают изменение кода во время разработки с немедленным отражением изменений файлов или каталогов хоста в контейнерах. Мы используем оба варианта.
Предупреждение! Использование привязываемых монтируемых образов позволяет изменять файловую систему хоста через работающие в контейнеры процессы, что включает создание, изменение или удаление важных системных файлов или каталогов. Это мощная возможность с функциями безопасности, которая может повлиять на процессы без Docker в системе хоста. Привязывемые монтируемые образы следует использовать с осторожностью.
Определите в файле docker-compose том с именем dbdata в определении службы db для постоянного сохранения базы данных MySQL:
Том с именем dbdata используется для постоянного сохранения содержимого папки /var/lib/mysql внутри контейнера. Это позволяет останавливать и перезапускать службу db без потери данных.
Добавьте в конце файла определение тома dbdata :
С этим определением вы сможете использовать этот том для разных служб.
Затем добавьте привязку монтируемого образа к службе db для файлов конфигурации MySQL, которые вы создадите на шаге 7:
Этот монтируемый образ привязывает файл
/laravel-app/mysql/my.cnf к каталогу /etc/mysql/my.cnf в контейнере.
Первый монтируемый образ привязывает код приложения в каталоге
/laravel-app к каталогу /var/www внутри контейнера. Файл конфигурации, добавляемые в
В заключение добавьте следующие привязки монтируемых образов в службу app для кода приложения и файлов конфигурации:
Служба app привязывает монтируемый образ папки
/laravel-app/php/local.ini к файлу /usr/local/etc/php/conf.d/local.ini в контейнере. На шаге 5 вы создадите локальный файл конфигурации PHP.
Теперь ваш файл docker-compose будет выглядеть следующим образом:
Когда закончите вносить изменения, сохраните файл и закройте редактор.
Шаг 4 — Создание файла Dockerfile
Docker позволяет задавать среду внутри отдельных контейнеров с помощью файла Dockerfile. Файл Dockerfile позволяет создавать персонализированные образы. которые можно использовать для установки требуемого программного обеспечения приложения и изменения настроек в соответствии с требованиями. Вы можете передавать созданные образы в Docker Hub или любой частный реестр.
Файл Dockerfile будет располагаться в каталоге
Этот файл Dockerfile будет задавать базовый образ и необходимые команды и инструкции для построения образа приложения Laravel. Добавьте в файл следующий код:
Директива RUN задает команды для обновления, установки и настройки параметров внутри контейнера, включая выделенного пользователя и группу с именем www. Инструкция WORKDIR задает каталог /var/www как рабочий каталог приложения.
Когда закончите вносить изменения, сохраните файл и закройте редактор.
Теперь вы можете перейти к определению конфигурации PHP.
Шаг 5 — Настройка PHP
Создайте каталог php :
Затем откройте файл local.ini :
Чтобы продемонстрировать настройку PHP, мы добавим следующий код для установки ограничений размера выгруженных файлов:
Сохраните файл и закройте редактор.
С сохраненным файлом PHP local.ini можно перейти к настройке Nginx.
Шаг 6 — Настройка Nginx
При настройке службы PHP вы можете изменять службу Nginx для использования PHP-FPM как сервера FastCGI для обслуживания динамического контента. Сервер FastCGI основан на двоичном протоколе для взаимодействия интерактивных программ с веб-сервером. Дополнительную информацию можно найти в статье «Понимание и реализация прокси FastCGI в Nginx».
Для настройки Nginx вы создадите файл app.conf с конфигурацией служб в папке
Вначале создайте каталог nginx/conf.d/ :
Затем создайте файл конфигурации app.conf :
Добавьте в файл следующий код, чтобы задать конфигурацию Nginx:
Серверный блок задает конфигурацию веб-сервера Nginx с помощью следующих директив:
Когда закончите вносить изменения, сохраните файл и закройте редактор.
Теперь посмотрим на параметры MySQL.
Шаг 7 — Настройка MySQL
После настройки PHP и Nginx вы можете активировать MySQL как базу данных для вашего приложения.
Чтобы продемонстрировать, как это работает, мы добавим в файл my.cnf настройки, которые включают журнал общих запросов и задают файл журнала.
Создайте каталог mysql :
Создайте файл my.cnf :
Добавьте в файл следующий код, чтобы активировать журнал запросов и задать местоположение файла журнала:
Сохраните файл и закройте редактор.
На следующем шаге мы запустим контейнеры.
Шаг 8 — Изменение настроек среды и запуск контейнеров
Откройте этот файл с помощью nano или другого текстового редактора на ваш выбор:
Найдите блок, задающий DB_CONNECTION и обновите его для отражения особенностей настройки вашей системы. Вы измените следующие поля:
Сохраните изменения и закройте редактор.
После завершения процесса используйте следующую команду для вывода списка всех запущенных контейнеров:
В этих результатах CONTAINER ID — это уникальный идентификатор каждого контейнера, а NAMES перечисляет имена служб для каждого контейнера. Вы можете использовать для доступа к контейнерам оба эти идентификатора. IMAGE определяет имя образа каждого контейнера, а STATUS предосавляет информацию о состоянии контейнера: запущен, перезапускается или остановлен.
Теперь у вас есть все необходимые настройки среды для запуска приложения. Чтобы кэшировать эти настройки в файле, ускоряющем загрузку приложения, запустите команду:
Настройки конфигурации будут загружены в файл /var/www/bootstrap/cache/config.php в контейнере.
Шаг 9 — Создание пользователя MySQL
При установке MySQL по умолчанию создается только административная учетная запись root с неограниченными привилегиями доступа к серверу баз данных. Обычно при работе с базой данных лучше избегать использования административной учетной записи root. Вместо этого мы создадим специального пользователя базы данных для базы данных Laravel нашего приложения.
Чтобы создать нового пользователя, запустите интерактивную оболочку bash в контейнере db с помощью команды docker-compose exec :
Выполните внутри контейнера вход в административную учетную запись MySQL root:
В результатах вы должны увидеть базу данных laravel :
Обновите привилегии, чтобы уведомить сервер MySQL об изменениях:
Выйдите из контейнера:
Вы настроили учетную запись пользователя для базы данных вашего приложения Laravel и готовы к миграции данных и работе с консолью Tinker.
Шаг 10 — Миграция данных и работа с консолью Tinker
Эта команда выполняет миграцию таблиц Laravel по умолчанию. Результаты подтверждения миграции выглядят следующим образом:
После завершения миграции вы можете отправить запрос для проверки правильности подключения к базе данных с помощью команды tinker :
Проверьте соединение MySQL, получив данные, миграцию которых вы только что произвели:
Вы получите следующий результат:
Вы можете использовать tinker для взаимодействия с базами данных и экспериментов со службами и моделями.
Теперь ваше приложение Laravel завершено и вы готовы к дальнейшей разработке и экспериментам.
Заключение
Теперь на вашем сервере работает приложение набора LEMP, которое вы протестировали, получив доступ к начальной странице Laravel и создав миграцию базы данных MySQL.
Главный фактор для простоты установки — Docker Compose, позволяющий создавать группу контейнеров Docker, определенную в одном файле, с помощью одной команды. Если вы хотите узнать больше о постоянной интеграции с Docker Compose, ознакомьтесь с обучающим модулем «Настройка среды постоянного тестирования интеграции с Docker и Docker Compose в Ubuntu 16.04». Если вы хотите ускорить процесс развертывания вашего приложения Laravel, вам поможет ресурс «Автоматическое развертывание приложений Laravel с помощью Deployer в Ubuntu 16.04».



