Использование докера для разработки веб-приложений Laravel очень увлекательно и избавит нас от головной боли, связанной с установкой и настройкой различных сервисов для нашей локальной среды.

Для начала убедитесь, что в вашей системе установлен Docker, и давайте углубимся в него. (Вы можете клонировать полный репозиторий в этом Github Repo.)

Давайте посмотрим на нашу файловую структуру, чтобы лучше понять, что происходит:

dockerfiles/
src/
mysql/
docker-compose.yml
.env

Внутри папки dockerfiles/ мы создадим следующие:

nginx/
nginx.dockerfile
php.dockerfile

Папка nginx/ предназначена для default.conf, и здесь находятся файлы докеров для создания наших пользовательских образов. Внутри папки nginx/ у нас есть обычный файл конфигурации (default.conf), как показано ниже:

И теперь мы можем сосредоточиться на нашей среде докеров.

  • Внутри nginx.dockerfile у нас есть:

Прежде всего, мы извлекаем облегченный образ Alpine, а затем устанавливаем идентификатор пользователя и идентификатор группы в качестве пользователя без полномочий root для докера, и если вам интересно, почему, потому что, если бы наш контейнер работал от имени пользователя root и мы создали файл из нашего контейнер через том обратно на наш хост Docker, тогда файл будет принадлежать root:root.

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

По умолчанию UID и GID равно 1000, но в многопользовательской среде вы можете получить что-то другое. Если вы хотите увидеть свой UID/GID, просто запустите следующую команду на своем терминале:

id

И вывод (для меня):

uid=1000(reza) gid=1000(reza) groups=1000(reza-work),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),998(docker)

После добавления пользователя с помощью команды ADD docker (которая существует в строке 16 из nginx.dockerfile):

Мы скопируем файл default.conf в нужное место образа nginx.

Внутри php.dockerfile у нас есть:

Файл докера Php довольно прост, и после настройки Composer мы можем установить любые расширения Php, которые нам нужны в нашем проекте, но обратите внимание, что мы хотим использовать Laravel, и этот фреймворк взаимодействует с MySql через PDO, поэтому установка этого расширения обязательна!

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

До сих пор у нас были файлы докеров, и если вы помните структуру наших файлов, нам нужно определить docker-compose.yml:

dockerfiles/
src/
mysql/
docker-compose.yml
.env

Файл docker-compose будет иметь нужные нам контейнеры, как показано ниже, и мы собираемся объяснить каждый из них.

Определенные сервисы будут иметь одну и ту же сеть с именем laravel, что позволит им без проблем взаимодействовать друг с другом.

В разделе build мы определим рабочий каталог как context и имя связанного dockerfile как nginx.dockerfile. Таким образом, docker compose перейдет в каталог context и будет использовать nginx.dockerfile.

Прежде всего, мы запустим экземпляр nginx, работающий в контейнере и использующий созданную конфигурацию nginx и определенный образ на ./dockerfile.

Мы установим UID/GID, который мы обсуждали ранее, и выставим порт 80:80 (левый — это наша система, а правый — в докере). Привязка ./src на хосте к /var/www/html даст доступ к nginx для обслуживания нашего веб-сайта Laravel, а раздел depends_on указывает, что для запуска этого сервиса требуется список сервисов, и без них ничего не произойдет.

Что означает delegated on/var/www/html:delegated ?

  • Используйте delegated для томов: всякий раз, когда док-контейнер выполняет изменения, хост находится в режиме только для чтения.
  • Используйте кеширование для томов: когда хост выполняет изменения, контейнер находится в режиме только для чтения.
  • По умолчанию: всякий раз, когда и контейнер, и хост активно и постоянно вносят изменения в данные.

Во-вторых, давайте создадим контейнер mysql:

Для этого мы используем официальный образ MariaDB версии 10.6, а опция restart: unless-stopped сообщает нам, что после остановки контейнера вручную он не будет перезапускаться автоматически даже после перезапуска демона докера, мы должны запустить его вручную.

Флаг tty связан с stdin, stdout. Псевдотерминал (также известный как tty) соединяет пользовательский терминал с возможностью потока stdin и stdout через оболочку, такую ​​как bash.

По умолчанию, всякий раз, когда мы отключаем сеть Docker, наши данные MySQL будут удалены после уничтожения контейнеров, но мы хотели бы иметь постоянные данные, которые остаются после переноса контейнеров, поэтому мы привязываем папку ./mysql к /var/www/html.

Как все мы знаем, каждой базе данных нужны некоторые переменные среды для работы с приложением, поэтому мы укажем environment и даже часовой пояс (TZ), чтобы иметь более надежные настройки.

mysql/
docker-compose.yml
.env

“${DB_DATABASE}” означает, что докер автоматически просматривает файл .env в том же каталоге, чтобы заполнить нужные ключи-значения. Файл .env содержит:

В-третьих, сделаем контейнер php:

Ранее мы написали все, что будет нужно на php.dockerfile, так что это простой раздел для этого контейнера. Нам просто нужно убедиться, что каталог контекста и dockerfile верны. Порт 9000 будет открыт для нашего приложения, а каталог ./src будет связан с контейнером для загрузки нашего будущего веб-приложения Laravel.

В-четвертых, настроим PhpMyAdmin:

Мы используем изображение по умолчанию для создания службы Phpmyadmin, а для учетных данных для входа мы будем использовать тот же пароль mysql .env. Единственная важная вещь — это PMA_HOST, которое должно совпадать с именем службы myql, чтобы Phpmyadmin автоматически подключался к базе данных, и нам не нужно было иметь дело с IP-адресами в докере.

В-пятых, контейнер Redis — это еще одна часть файла компоновки докера:

Последний шаг — создание контейнеров Composer, Npm и Artisan. Они настолько просты, что мы можем определить их, как показано ниже:

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

Например, если мы определим ниже entrypoint для контейнера с именем test:

entrypoint: ["echo", "Hello World"]

После запуска:

docker run test

Результат:

Hello World

Таким образом, когда контейнер запускается, выполняется инструкция ENTRYPOINT, а Hello World повторяется.

Давайте посмотрим на наш docker-compose.yml:

Довольно большой файл docker-compose.yml, верно? но это работает хорошо, и вы можете клонировать полный репозиторий в этом Github Repo.

Что теперь?

Затем перейдите в своем терминале в каталог, который вы клонировали над репозиторием, и запустите контейнеры для веб-сервера, запустив docker-compose up -d --build app.

Для нашего веб-сервера созданы следующие контейнеры с подробным описанием открытых портов:

  • nginx:80
  • mysql:3306
  • приложение:9000
  • редис:6379
  • phpmyadmin:8081

Теперь мы можем использовать нашу папку ./src по одной из этих инструкций:

  • Клонируйте свой проект Laravel или скопируйте все файлы прямо в этот каталог src.
  • Установите новый проект Laravel, запустив docker-compose run --rm composer create-project laravel/laravel . в своем терминале внутри папки ./src.

Включены три дополнительных контейнера, которые обрабатывают команды Composer, NPM и Artisan без установки этих платформ на локальном компьютере.

Используйте следующие примеры команд из корня вашего проекта, изменив их в соответствии с вашим конкретным вариантом использования.

  • docker-compose run --rm composer update
  • docker-compose run --rm npm run dev
  • docker-compose run --rm artisan migrate

Получите доступ к контейнеру как к интерактивной оболочке и посмотрите вывод:

docker exec -it <container id> sh

Наше докер-приложение доступно через http://localhost:9000.

Вот и все.

ЧИТАТЬ ДАЛЕЕ: