Рубрики
Uncategorized

Докер Laravel Красота Docker для локальной разработки Laravel

Docker и Laravel могут работать вместе в прекрасной гармонии, чтобы упростить и упростить настройку настраиваемых локальных сред разработки. С тегами laravel, docker, php, webdev.

tl;dr

Хотите пойти быстрым путем и пропустить подробное руководство ниже? Установить Docker для вашей ОС клонируйте это хранилище , добавьте файлы приложения Laravel в каталог src и из корневого каталога проекта, который вы только что клонировали, запустите: docker-compose build && docker-compose up -d .

Краткое Вступление

Прежде чем мы начнем, следует знать, что эта статья не является полноценным учебным пособием по Docker или объяснением тонкостей набора инструментов. Это скорее упрощенное пошаговое руководство по быстрой настройке локальной среды разработки с помощью Docker и docker-compose, в отличие от установки стека LAMP непосредственно на вашем компьютере. С этим связано несколько предостережений, но я обнаружил, что приведенный ниже метод лучше всего подходит для меня при разработке приложений Laravel.

Для тех, кто не знает, что такое Docker, давайте насладимся кратким обзором. Согласно opensource.com:

Docker – это инструмент, предназначенный для упрощения создания, развертывания и запуска приложений с помощью контейнеров. Контейнеры позволяют разработчику упаковывать приложение со всеми необходимыми частями, такими как библиотеки и другие зависимости, и отправлять все это в одном пакете.

Вы можете думать о Docker как о разбавленной виртуальной машине.

Почему это полезно или полезно? Хорошо, если у вас есть несколько производственных серверов, на которых работают разные версии Linux, PHP или любого другого веб-программного обеспечения, эти переменные могут быть реплицированы в вашем контейнере, и вы можете быть уверены, что приложение будет работать точно так, как оно предназначено на производственной машине.

В соответствии с тоном этого поста, если у вас есть несколько проектов Laravel, охватывающих разные версии на вашем локальном компьютере, вы можете иметь определенную конфигурацию Docker для каждого приложения без необходимости реализовывать что-то вроде переключателя версий PHP и изменять конфигурацию вашей фактической машины. Вы даже можете получить доступ к обоим проектам одновременно, при этом каждый контейнер работает изолированно от другого.

Звучит захватывающе? Давайте нырнем внутрь!

Установка Докера

На протяжении всей этой статьи скриншоты и ссылки будут относиться к пользователям Mac OS. Однако инструкции по установке и использованию должны быть очень похожими (если не почти точными) в Windows.

Во-первых, возьмите установщик: https://docs.docker.com/docker-for-mac/install/ .

Выполните обычный процесс установки приложения, открыв приложение после его завершения. При первом открытии вам будет предложено авторизовать Docker с помощью системного пароля, после чего вы увидите значок маленького кита, появляющийся в верхней строке состояния.

Структура проекта

Ниже приведена структура, которую я использовал для своих проектов Laravel + Docker. Вам не обязательно следовать этому явно, хотя в остальной части этой статьи предполагается, что ваш проект настроен с тем же макетом.

my-project.com/
├── nginx/
│   └── default.conf
├── src/
│   └── (Laravel app files)
├── docker-compose.yml
└── Dockerfile

В следующих двух частях я расскажу о том, что делает каждый из этих файлов, но сейчас просто создайте их как пустые заполнители, используя макет выше. Кроме того, добавьте (или создайте) все файлы вашего приложения Laravel в src/ каталог.

Создание Нашего Стека

Отличное эмпирическое правило при использовании Docker заключается в том, что каждый контейнер должен предоставлять одну услугу. Поскольку мы создаем типичный стек LAMP, это означает, что нам понадобится один для нашего веб-сервера ( Nginx ), PHP и MySQL . Хотя теоретически мы могли бы создать отдельные контейнеры для каждой из этих служб, а затем попытаться связать их вместе, в Docker есть прекрасный встроенный инструмент для этого, называемый docker-compose .

Что мы делаем, так это определяем службы, которые будут использоваться, и во время выполнения Docker предоставляет каждую из них в качестве контейнера и помещает их все в виртуальную сеть. Это означает, что каждая услуга будет доступна из каждого контейнера.

Для начала откройте файл docker-compose.yml и добавьте в него следующее:

Несколько кратких объяснений того, что мы только что добавили:

  • Версия: 3 , новейшая и наиболее рекомендуемая версия движка docker-compose
  • Сети: Мы используем только одну сеть, laravel , к которой мы не добавляем никаких опций, кроме имени
  • Услуги: Где мы будем указывать изображения, которые будут составлять наш стек

Добавление Nginx

Непосредственно под заголовком “сервисы”, который мы указали в нижней части файла docker-compose.yml выше, вы добавите следующее:

В приведенном выше примере мы сообщаем докеру, что нам нужен контейнер с именем nginx , созданный на основе изображения nginx:stable-alpine (полный источник которого вы можете увидеть здесь ). Мы используем alpine linux в качестве базовой ОС из-за ее легкого и отзывчивого расположения.

Далее мы называем контейнер nginx и выставляем его :80 порт как :8080 на нашей локальной машине. Этот номер порта мы в конечном итоге будем использовать для доступа к нашему сайту, и вы можете настроить его на любой не зарезервированный номер порта, который вам нравится.

Для томов веб-сервера мы добавляем два следующих:

  • Наш местный /src папка привязана к пути контейнера /var/www . В отличие от символической ссылки, все, что мы изменяем в/src, будет немедленно доступно серверу в разделе/var/www.
  • Созданный нами файл /nginx/default.conf связан с файлом контейнера /etc/nginx/conf.d/default.conf и даст нам возможность изменять веб-сервер nginx на нашем локальном компьютере.

Вы можете указать любое количество каталогов или файлов под этим заголовком, чтобы связать их символической ссылкой с вашего локального компьютера в контейнер nginx.

Добавляя как php, так и mysql (сервисы, которые мы создадим далее) в пункт depends_on , мы сообщаем Docker, что при инициализации контейнеры php и mysql должны быть запущены до того, как это сделает nginx. Кроме того, если бы мы попытались запустить только контейнер nginx, он также загрузил бы оба этих зависимых контейнера.

Наконец, мы указываем, что этот контейнер явно находится в сети laravel , которую мы создали в начале нашего файла docker-compose.yml.

Добавление MySQL

Следующий сервис, который мы добавляем в наш файл docker-compose.yml , – это MySQL. Этот вариант относительно прямолинеен.

Первоначально мы указываем имя изображения и контейнера, а также устанавливаем некоторые другие настройки, которые, как я чувствую, помогли сохранить стабильность MySQL в контейнере.

Порт MySQL по умолчанию :3306 – это тот, который мы предоставляем нашему локальному компьютеру, а затем, используя объект среда , мы можем установить несколько переменных, используемых во время инициализации для изменения созданной базы данных. Поскольку мы настраиваем Docker для приложения Laravel, я использую имя базы данных/имя пользователя/пароль по умолчанию, найденные в типичном файле Laravel .env.

Как и в случае с nginx, мы подключаем эту службу к сети laravel . ✨ Просто!

Добавление PHP

В отличие от Nginx и MySQL, добавление нашего контейнера PHP будет проходить по другому и немного более сложному пути. С помощью предыдущих двух сервисов мы смогли напрямую ссылаться на изображение для создания нашего контейнера, однако из-за зависимости, которую требует Laravel, мы фактически будем создавать наш собственный образ из локального файла Dockerfile.

Прежде чем мы перейдем к этой части, добавьте следующее в качестве следующего (и последнего) сервиса в наш файл docker-compose.yml .

Вы уже можете заметить разницу, мы заменяем изображение заголовок, который мы использовали раньше с build one. В нем мы указываем контекст как текущий каталог проекта, а файл dockerfile – как файл Dockerfile (который мы уже создали ранее).

Как и в случае с нашим контейнером nginx, мы указываем тот же том для корневого каталога, затем открываем порт : 9000 для контейнера и устанавливаем сеть на laravel .

Теперь, когда мы добавили эту службу, пришло время добавить следующее в наш файл Dockerfile :

Да, вот и все.

Все, что мы здесь делаем, это:

  • Указывая, что мы хотим, чтобы наш php-контейнер был построен из 7.2-fpm-alpine PHP изображения.
  • Установка расширений pdo и pdo_mysql PHP, которые Laravel ORM использует в своих методах базы данных.

Команда docker-php-ext-install встроена (и плохо документирована ) в Docker. Вы можете пройти через любое расширение PHP, и оно будет обрабатывать установку и настройку в нашем недавно созданном контейнере.

Настройка nginx

Помните наш файл /nginx/default.conf , который мы создали? Откройте его и добавьте следующее:

Честно говоря, здесь особо нечего обсуждать, так как в основном это стандартная конфигурация nginx, используемая в большинстве базовых приложений Laravel. Обратите внимание, что корневой путь был установлен в общую папку нашего каталога /var/www nginx, с которым мы связали наше приложение Laravel.

Запуск Докера

У нас есть все наши отдельные части в порядке, теперь, наконец, пришло время собрать нашу сеть докеров! Откройте окно терминала и перейдите в корневой каталог этого проекта. Поскольку один из наших контейнеров ( php ) использует файл Dockerfile в качестве изображения, и мы впервые запускаем эти контейнеры, первое, что нам нужно сделать, это запустить команду build для создания данных изображения:

докер-компоновка сборки

Это займет некоторое время, чтобы закончить, и может показаться, что какое-то время ничего не происходит. Дайте ему около 1-2 минут, и вы должны были увидеть Успешно созданные и Успешно помеченные сообщения в вашем терминале. Затем вы можете приступить к фактическому запуску контейнеров с помощью:

докер-составление -d

Docker создаст нашу сеть laravel, а затем создаст три контейнера, которые мы указали в разделе “Сервисы” нашего файла docker-compose.yml. Если вам интересно узнать о флаге -d , он означает отсоединенный и поддерживает работу контейнеров после обработки всех их команд. В противном случае Docker остановит их, как только они завершат свою инициализацию. Довольно бессмысленно для веб-сервера!

Настройка Laravel

Прежде чем мы получим доступ к нашему приложению в первый раз, нам нужно внести некоторые небольшие изменения в наш файл Laravel .env. В частности, в отношении подключения к базе данных и домена приложения. Откройте .среду вашего проекта . файл в каталоге src и измените следующие строки:

  • DB_HOST=mysql – Это имя взято из службы MySQL, которую мы создали в файле docker-compose.yml, и используется в сети Docker для ссылки на службу из других контейнеров.
  • APP_URL=http://localhost:8080 – Добавьте номер порта, который вы указали в нашем контейнере nginx, чтобы он указывал на разрешимый адрес.

Доступ к Вашему Приложению

Предполагая, что все на вышеуказанном шаге началось успешно, теперь мы можем посетить наш контейнер с открытым портом и увидеть целевую страницу нашего приложения!

В вашем браузере перейдите по ссылке http://localhost:8080 где 8080 это первый порт, который вы указали в службе nginx в своем файле docker-compose.yml.

💥 Бум! У нас есть наше приложение Laravel, работающее в сети Docker!

Конечно, если вы, вероятно, также захотите получить доступ к своей базе данных MySQL с помощью такого инструмента, как Таблица Плюс , и подключиться к ней так же просто. Все, что вы собираетесь сделать, это использовать 127.0.0.1 в качестве хоста вместе с портом, который вы указали в службе MySQL в нашем файле docker-compose.yml (который в этом примере мы сохранили по умолчанию 3306 ).

Ваше имя пользователя и пароль мы указали в переменных среды как MYSQL_USER и MYSQL_PASSWORD , усадьба и секрет соответственно.

Примечание: Если вы планируете запускать несколько сетей одновременно для разных проектов, вам придется указать разные порты для доступа на вашем локальном компьютере (например, 8080 для одного, 8081 для другого). В противном случае вы получите сообщение об ошибке порт уже выделен во время инициализации контейнера.

Выполнение команд

Laravel довольно часто использует командную строку для таких вещей, как миграции, очереди и тесты. Выполнить их в нашей сети Docker очень просто с помощью команды docker-compose exec .

Вместо виртуальной машины, где вы подключаетесь к системе по ssh и выполняете команды непосредственно в ОС, Docker предпочитает, чтобы вы передавали команды в контейнер (ы) а затем вывод этих команд передается обратно на ваш терминал. Например, давайте запустим миграции по умолчанию, которые поставляются с Laravel, выполнив следующую команду в нашем терминале в корне проекта:

docker-создать исполняемый файл php php/var/www/ремесленник мигрирует

Давайте немного разберем это:

  • docker-compose exec сообщает Docker, что мы хотим выполнить команду в нашей контейнерной сети.
  • php имя контейнера, на котором мы хотим выполнить команду. Поскольку мы собираемся выполнять команду PHP, она должна быть в контейнере, на котором работает PHP.
  • php/var/www/artisan migrate фактическое название команды, которую мы запускаем. Мы используем абсолютный путь к artisan, который связан символическими ссылками через наш локальный том в ./src и выполняет стандартную миграцию Laravel.

После выполнения нашей команды вам должны быть представлены результаты миграции, и теперь ваша база данных будет заполнена двумя таблицами!

Любое количество команд может быть запущено с нашего локального терминала в контейнеры Docker по нашему выбору. Просто будьте в курсе служб, установленных и доступных в контейнере, в котором вы хотите выполнить команду.

Подсказка: Если вы твердо намерены использовать ssh непосредственно в контейнере для выполнения команд, есть довольно простой обходной путь. Запуск docker-compose exec {имя_контейнера}/bin/sh откроет постоянное соединение с контейнером, указанным в аргументе {имя_контейнера}.

Конец линии

Что ж, вот оно у нас и есть! Мы установили Docker, настроили и настроили файл docker-compose для создания стека LEMP из трех контейнеров, объединенных в единую сеть, открыли порты в этой сети, которые позволяют нам получать доступ к нашему приложению и базе данных, и даже запустили команды cli через метод exec docker-compose.

Двигаясь вперед, если вы хотите отключить контейнеры и сеть, это так же просто, как перейти в корневую папку вашего проекта и запустить docker-compose вниз . Это приведет как к повреждению, так и к уничтожению контейнеров и любых связанных с ними данных, не относящихся к объему , которые хранились в них.

Docker открыл для меня целый мир возможностей для разработки, когда я жонглирую несколькими проектами, охватывающими разные версии Laravel. Я могу легко запустить один проект в сети Docker с контейнером PHP, используя 7.1 , и если бы я хотел посмотреть, как мой текущий проект будет работать на PHP 7.3 это так же просто, как изменить одиночный символ в моем файле Docker, перестроить контейнер и восстановить сеть docker-compose.

Я не буду этого отрицать, вы не получите лучшей производительности локальной разработки, чем запуск вашего стека непосредственно на оборудовании вашей машины. Но компромисс производительности для универсальности, простоты использования, параллельных сред и настройки значительно перевешивает это для меня.

Если у вас есть какие-либо вопросы, комментарии или вы хотите больше поговорить о PHP и Laravel, не стесняйтесь обращаться ко мне по адресу Твиттер ! Если вы ищете супер простую службу мониторинга ошибок и журналов специально для приложений Laravel , я создал Карахок . В настоящее время он находится в закрытой бета-версии и скоро будет запущен всего за 5 долларов за приложение в месяц.

Оригинал: “https://dev.to/aschmelyun/the-beauty-of-docker-for-local-laravel-development-13c0”