Ранее была опубликована статья, вкоторой описывалась настройка 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 самостоятельно. Можно воспользоваться готовыми вариантами и модифицировать их. Один из таких вариантов описан в статье, о которой говорилось в самом начале.