Laravel + Vue в Docker с помощью Sail

Ранее была опубликована статья, вкоторой описывалась настройка fullstack приложения Laravel + Vue с выносом Laravel на поддомен. Vue приложение располагалось на основном домене, а api на Laravel — на поддомене backend.

Но Laravel имеет в своем распоряжении инструмент sail, который позволяет легко настроить docker окружение не прибегая даже, зачастую, к составлению файлов Dockerfile и docker-compose.yml.

Если вы создаете новое Laravel приложение, то можете с помощью этого инструмента произвести и процесс создания.

curl -s https://laravel.build/my-app | bash

Здесь через query параметр with можно было задать и набор сервисов, например,

curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

Если вы этого не делали, то будет создан набор по-умолчанию — mysql, redis, meilisearch, mailhog и selenium.

В случае, если у нас имеется уже laravel приложение, можно установить sail так:

composer require laravel/sail --dev

После установки пакета необходимо выполнить команду sail:install

php artisan sail:install

В результате в корне приложения появится файл docker-compose.yml с настройками сервисов.

И наконец, мы сможем запустить контейнеры

./vendor/bin/sail up

Для удобства дальнейшей работы можно добавить алиас в настройки командной оболочки ( например, добавить его в ~/.zshrc или ~/.bashrc )

alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'

Тогда вместо ./vendor/bin/sail мы сможем выполнять просто sail

Итак, после создания алиаса, работа с docker котейнерами для приложения будет выглядеть так

sail up # Запуск контейнеров в обычном режиме
sail up -d # Запуск контейнеров в фоновом режиме
sail stop # Остановка контейнеров
sail artisan queue:work # Запуск artisan команды queue:work (по аналогии - другие artisan команды)
sail php script.php # Обращение к интерпретатору php (например для запуска скрипта)
sail composer require laravel/sanctum # Установка пакета через composer
sail node --version # Обращение к npm

Для работы с БД mysql и redis в .env файл уже внесены настройки, которые позволяют работать с сервисами в docker.

DB_HOST=mysql
...
REDIS_HOST=redis
...

После команды sail up приложение будет доступно в браузере по адресу http://localhost. На host машине с MySQL можно будет соединиться через localhost и порт 3306, с redis — через localhost и порт 6379. Открыть веб интерфейс для локальной работы с почтой через mailhog можно будет по адресу http://localhost:7700. Но, конечно, все пройдет гладко, если только у вас не заняты эти порты чем-то другим. Например, запущенными mysql на 3306 и nginx на порту 80.

Если порты у вас заняты, то необязательно выключать локальные сервисы. Файл docker-compose.yml, который нам предоставил sail неплохо продуман. Для ключевых сервисов есть возможность менять порты. Например для сервиса laravel.test есть записи

ports:
    - '${APP_PORT:-80}:80'
    - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'

Переменные APP_PORT и VITE_PORT могут быть считаны из .env файла. Поэтому, если у вас занят порт 80, то вы можете добавить в .env файл, скажем APP_PORT=81 и ваше приложение будет открываться на 81м порту — http://localhost:81.

Аналогичным образом можно поступить и с портами других сервисов. Для Mysql — переменная FORWARD_DB_PORT, для Redis — FORWARD_REDIS_PORT.

Если вы не работаете с frontend современными способами, то на этом можно было бы и закончить статью. Но для работы с vue (или React) понадобится сделать еще некоторые шаги. Например, воспользоваться пакетом для старта приложения или же настроить Vite самостоятельно. Подробно об инструментарии для работы с frontend в Laravel написана отдельная статья.

В ряде случаев, из-за специфики проекта, понадобится редактировать настройки контейнеров, которые недоступны в docker-compose.yml. Для таких целей есть команда

sail artisan sail:publish

Эта команда скопирует файлы Dockerfile из пакета sail в ваш проект. И вы сможете произвести необходимые модификации (не забывая указать верный контекст в docker-compose.yml там, где следует).

Также интересной особенностью sail является возможность показать сайт с вашей машины кому-либо удаленно. Это можно осуществить командой sail share, которая сделает доступным ваш сайт на поддомене laravel-sail.site.

Выводы

Таким образом, можно запускать в контейнерах docker приложение Laravel даже не касаясь конфигурационных файлов docker или docker-compose. Конечно в этом случае вы получите вариант для самого общего случая. Также небольшим минусом будет, что на машине должен быть php для установки и работы пакета sail.

Чтобы настроить приложение под специфику своего проекта, придется разбираться как настроить все это через docker самостоятельно. Можно воспользоваться готовыми вариантами и модифицировать их. Один из таких вариантов описан в статье, о которой говорилось в самом начале.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *