Введение

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

Sail предоставляет вашему приложению Laravel среду разработки Docker. Благодаря этому вам не придется вручную создавать Docker-контейнер для вашего приложения Laravel. По умолчанию он предоставит вам локальную среду разработки, состоящую из PHP, MySQL и Redis, хотя вы можете выбрать конкретные сервисы, которые вам нужны. Это означает, что разработчикам Laravel больше не нужно выполнять какую-либо специальную настройку (например, установку PHP, MySQL, локального сервера и т. д.) в своей операционной системе, чтобы начать создание приложения Laravel. С Sail они могут сразу взяться за дело.

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

Если вы сотрудничаете с другими разработчиками над проектом, Sail сделает обмен информацией простым и понятным, поскольку вам не нужно будет принимать во внимание операционные системы, которые используют другие разработчики.

Sail следует за длинным списком попыток создания среды разработки Laravel, такой как Homestead, Valet, Laragon, Takeout, Laradock и Vessel.

Весь пакет состоит из двух файлов: файла docker-compose.yml, который содержит контейнеры Docker вашего приложения, и сценария Sail, который предоставляет вам CLI для взаимодействия с этими контейнерами. Файл docker-compose.yml находится в корневом каталоге вашего проекта, а сценарий Sail — в каталоге поставщика/bin.

В этой статье мы узнаем, как установить и использовать Laravel Sail. Мы создадим новый проект и внимательно рассмотрим некоторые важные команды Sail.

Предварительные условия

Единственное требование Sail — чтобы Docker был установлен в операционной системе, в которой он будет запускаться.

Если вы используете Windows, вам необходимо установить и включить подсистему Windows для Linux 2 (WSL2). Это позволит вам запускать двоичные исполняемые файлы Linux прямо в вашей ОС Windows. Кроме того, обязательно настройте Docker Desktop для использования серверной части WSL2.

В противном случае опыт работы с Docker не требуется.

Шаг 1. Установка и настройка Sail

Каждое новое приложение Laravel поставляется с Sail «из коробки». Для его раскрутки требуется всего одна простая команда.

Запустите следующую команду, чтобы создать новое приложение Laravel:

curl -s https://laravel.build/new-sail-application | bash

Приведенная выше команда создает проект в новом каталоге с именем new-sail-application. Не стесняйтесь переименовывать его так, как вы хотите, чтобы ваш проект назывался.


Далее перейдите в каталог проекта:

cd new-sail-application
Чтобы запустить Sail, выполните следующую команду:
./vendor/bin/sail up


Добавление Sail в существующее приложение

Вы также можете установить Sail в существующее приложение с помощью Composer, при условии, что ваша локальная среда разработки настроена для его использования:

composer require laravel/sail --dev

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

php artisan sail:install

Наконец, чтобы запустить Sail, выполните следующую команду:

./vendor/bin/sail up

Шаг 2. Внимательное рассмотрение вашего приложения

Теперь ваша среда разработки запущена и работает. В Docker каждый контейнер содержит только один сервис. Это означает, что наше приложение Sail поставляется с тремя службами: одной для PHP, одной для MySQL и третьей для Redis.
Эти три контейнера размещаются и управляются Docker Compose с использованием файла docker-compose.yml в корне вашего проекта. Если вы откроете этот файл, вы увидите раздел служб с тремя компонентами: laravel.test, mysql и redis:


laravel.test обрабатывает компонент PHP, а два других — то, что предполагают их имена.
В службе MySQL (эта служба управляет вашей базой данных) вы найдете параметр изображения, который указывает изображение, экземпляр которого создает этот контейнер. По сути, изображение похоже на проект дома, а контейнер — это сам построенный дом. Также указывается устанавливаемая версия MySQL (8.0):

mysql:
    image: 'mysql:8.0'
    ports:
        - '${FORWARD_DB_PORT:-3306}:3306'
    environment:
        MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        MYSQL_DATABASE: '${DB_DATABASE}'
        MYSQL_USER: '${DB_USERNAME}'
        MYSQL_PASSWORD: '${DB_PASSWORD}'
        MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
        - 'sailmysql:/var/lib/mysql'
    networks:
        - sail
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]

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

DB_PORT:-3306 

— это ваш локальный порт, а строка

${FORWARD_DB_PORT:-3306}:3306 

синхронизирует его с портом вашего контейнера.

В среде определяются учетные данные вашей базы данных. В настоящее время они указывают на значения в файле .env, расположенном в корневом каталоге вашего проекта.
Docker использует тома для сохранения (или сохранения) данных, используемых контейнером (даже после уничтожения контейнера). Экстернализация данных или хранение данных вне контейнера важно по множеству причин.
Контейнеры по замыслу созданы временными. Таким образом, когда они выходят из строя или останавливаются, все хранящиеся в них данные теряются. Когда данные записываются в том и контейнер, которому они принадлежат, закрывается, данные остаются и, таким образом, могут быть использованы новым контейнером. Постоянные данные также могут совместно использоваться несколькими контейнерами на разных машинах.
Строка Volumes: - 'sailmysql:/var/lib/mysql' просто использует том с именемailmysql для сохранения всех данных в каталоге var/lib/mysql (здесь хранятся наши данные MySQL).
Для совместной работы все сервисы в нашем контейнере должны быть подключены к одной сети. Параметр network указывает, какую внутреннюю сеть должен использовать ваш контейнер, в данном случае — парусную.
Наконец, параметр health указывает команды, которые Docker должен выполнить, чтобы проверить состояние вашего контейнера и убедиться, что он работает должным образом.
Если вы внимательно посмотрите на сервис laravel.test, то первым будет параметр build. Он указывает на Dockerfile, расположенный в ./vendor/laravel/sail/runtimes/8.0. Этот Dockerfile был создан командой Laravel и содержит инструкции по созданию нужного нам образа, поэтому мы не будем создавать экземпляры каких-либо изображений из Docker Hub:

laravel.test:
    build:
        context: ./vendor/laravel/sail/runtimes/8.0
        dockerfile: Dockerfile
        args:
            WWWGROUP: '${WWWGROUP}'
    image: sail-8.0/app
    ports:
        - '${APP_PORT:-80}:80'
    environment:
        WWWUSER: '${WWWUSER}'
        LARAVEL_SAIL: 1
    volumes:
        - '.:/var/www/html'
    networks:
        - sail
    depends_on:
        - mysql
        - redis
        - selenium

Параметр image указывает на изображение, экземпляр которого будет создан. В данном случае тот, который создан build. ports сопоставляет наш контейнер и локальные порты вместе. Environments указывает на учетные данные, которые будут использоваться в нашем PHP-коде. Volumes используется для сохранения соответствующих данных PHP, которые мы не хотим потерять, а network указывает внутреннюю сеть, к которой должен быть подключен этот сервис.
Параметр depend_on указывает, какие службы должны быть запущены, прежде чем наше приложение сможет быть запущено. Наше приложение зависит от MySQL, Redis и Selenium.
Последний сервис, redis, аналогичен сервису MySQL:

redis:
    image: 'redis:alpine'
    ports:
        - '${FORWARD_REDIS_PORT:-6379}:6379'
    volumes:
        - 'sailredis:/data'
    networks:
        - sail
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

Сначала создается экземпляр образа Redis. Затем наш контейнер и локальные порты синхронизируются. Мы используем том для сохранения наших данных Redis, определяем внутреннюю сеть, к которой должен быть подключен этот сервис, и выполняем проверку работоспособности, чтобы убедиться, что наш контейнер работает правильно.

Шаг 3 – Пробуем некоторые команды Sail

По умолчанию для запуска команд Sail перед командами должна стоять строкаvendor/bin/sail. Однако мы можем настроить псевдоним bash, состоящий всего из одного слова, чтобы сделать наши команды короче.
По сути, мы заменим слово «vendor/bin/sail» словом «sail»:
alias sail = 'bashvendor/bin/sail'
Чтобы запустить все контейнеры в нашем файле docker-compose.yml и запустить наше приложение, мы используем следующую команду:
sail up
Чтобы запустить контейнеры в фоновом режиме, мы используем:
sail up -d
Как только ваше приложение будет запущено, вы можете посетить http://localhost, чтобы просмотреть его.
Чтобы остановить контейнеры, нажмите Control + C на клавиатуре. Если они работают в фоновом режиме, запустите:

sail  down
При запуске команд artisan, композитора и npm псевдоним sail должен предшествовать командам.

Например, вместо запуска:

php artisan migrate
Ты запускаешь:

sail artisan migrate

И вместо запуска:

composer require laravel/sanctum
Ты запускаешь:

sail composer require laravel/sanctum

Заключение

Вы дошли до конца урока! Нам удалось создать и настроить новое приложение Sail. Мы просмотрели файл docker-compose.yml от Sail и узнали, как настраиваются контейнеры. Мы также изучили некоторые важные команды для запуска нашего приложения Sail. Но всегда есть что узнать! Чтобы узнать больше о Sail, ознакомьтесь с официальной документацией.