Настраиваем Docker для Laravel за 15 минут

Laravel Docker

В этой статье я расскажу, как можно запустить приложение Laravel внутри контейнера Docker за 15 минут. Пропущу объяснения, что такое Docker и почему нужно докеризировать своё приложение, про всё это есть множество статей в интернете. Если вы еще не установили Docker и Docker Compose, то сделайте это.

Образы Docker могут быть собраны на основе широкого спектра базовых образов, таких как Ubuntu или (предпочтительно) Alpine Linux. Несмотря на то, что сборка собственного образа с нуля гарантирует его соответствие вашим нуждам, но это может быть довольно сложным. Особенно, если вы хотите начать побыстрее начать работу над своим проектом. Поэтому я создал образ под названием Alpine Artisan на основе замечательного Docker Webstack, содержащего Alpine Linux, PHP-FPM и Nginx. Alpine Artisan можно найти на Docker Hub и GitHub.

Я уже установил в него несколько PHP-расширений, чтобы вы могли работать с MySQL и Redis (включая Laravel Horizon). Я предполагаю, что вы используете дефолтную структуру Laravel и что корневой каталог вашего приложения напоминает структуру свежесозданного приложения Laravel. То, что происходит внутри каталогов app или resources, не имеет значения, важно только то, что они там есть.

Итак, запускаем таймер!

Шаг первый: Dockerfile

Создайте новый файл Dockerfile в корне вашего приложения. Обратите внимание, что у файла нет расширения Добавьте в него следующее:

FROM jeroeng/alpine-artisan:web7.3

FROM — это, в основном, оператор подключения, он подтягивает образ, на котором построится ваш текущий. Вся магия происходит внутри образа Alpine Artisan, поэтому здесь вам больше ничего не нужно делать. Двигаемся дальше!

Шаг второй: файл docker-compose.yml

Создайте файл docker-compose.yml рядом с Dockerfile. Docker Compose — отличный инструмент для создания контейнеров Docker, и он, безусловно, делает всё это значительно более фановым. В файл docker-compose.yml добавьте следующее:

services:
  app:
    build: .
    ports:
      - 80:80

  db:
    image: percona:5.7
      environment:
        MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-secret}
        MYSQL_DATABASE: my_database
        MYSQL_USER: jeroen
        MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-secret}
      volumes:
        - mysql-data:/var/lib/mysql:rw
      ports:
        - 3306:3306

  queue:
      image: redis:5-alpine
      ports:
        - 6379:6379

volumes:
  mysql-data:

Если вы не знакомы с Docker Compose, это нижеследующее может быть вам очень полезным! Давайте разбираться. В этом файле мы просим создать три службы: приложение, базу данных и экземпляр Redis. Если последние две вам не нужны, можете их исключить. Каждый сервис будет контейнером основанным на локальном Dockerfile или образе в Docker Hub. Наконец, мы будем хранить данные в базе данных в томе (volume) (для этого не требуется дополнительная настройка). Если вы хотите хранить и другие данные, то вы можете создать дополнительные тома и смонтировать их в соответствующие контейнеры.

Контейнеру app целью build назначен файл Dockerfile, который мы только что создали и который находится в той же папке. После запуска, мы можем увидеть наше приложение по адресу localhost:80, Контейнер базы данных настраивается из образа MySQL, а переменные окружения, которые мы задаем, используются для root-пользователя. Контейнер redis очень прост и не требует дополнительной настройки.

Шаг третий: файл .env

Чтобы ваше приложение могло взаимодействовать с Redis и базой данных, вы должны задать следующие переменные в вашем .env. Необходимо, чтобы они соответствовали значениям в docker-compose.yml

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=my_database
DB_USERNAME=jeroen
DB_PASSWORD=secret

QUEUE_CONNECTION=redis
REDIS_HOST=queue
REDIS_PASSWORD=
REDIS_PORT=6379

Шаг четвертый: запуск!

Если вы не знакомы с Docker и Docker Compose, то вам необходимо запомнить следующие основные команды:
docker-compose up — запуск собранных образов. Добавьте параметр -d, чтобы запускать их в фоне.
docker-compose build — для сборки или перестройки контейнеров. Альтернативой является параметр --build для команды up.
docker-compose ps — список текущих (запущенных) контейнеров.
docker-compose down — остановка и удаление контейнеров.

Поскольку это первый раз для этой конфигурации, то нам нужно будет наши контейнеры собрать и запустить. Для этого я использую команду up с дополнительными параметрами:

docker-compose up -d --build

Шаг пятый: останавливаем таймер!

Когда команда выполнится, то ваше приложение должно быть доступно по адресу localhost:80. Если этот порт конфликтует с другими сервисами, то нужно его изменить в в docker-compose.yml, например, на 9000:80. Последний порт всегда находится внутри сети Docker (то есть между контейнерами), а первый — вне её.

Если вам нужен shell-доступ к любому из ваших контейнеров, то используйте команду docker-compose exec app sh

Вот и всё, я надеюсь, что вы проделали всё это за 15 минут, что я и обещал в начале урока ;)

Автор: Jeroen
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.