Убунту 22.04

Введение

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

В этом руководстве мы будем использовать Docker Compose для контейнеризации приложения Laravel для разработки. Когда вы закончите, у вас будет демонстрационное приложение Laravel, работающее в трех отдельных сервисных контейнерах:

  • Служба app , работающая под управлением PHP7.4-FPM;
  • Служба db , работающая под управлением MySQL 5.7;
  • Служба nginx , которая использует службу app для анализа PHP-кода перед передачей приложения Laravel конечному пользователю.

Чтобы упростить процесс разработки и облегчить отладку приложений, мы будем синхронизировать файлы приложения, используя общие тома. Мы также увидим, как использовать команды docker-compose exec для запуска Composer и Artisan в контейнере app .

Развертывайте свои интерфейсные приложения из GitHub с помощью платформы приложений DigitalOcean. Позвольте DigitalOcean сосредоточиться на масштабировании вашего приложения.

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

  • Доступ к локальному компьютеру Ubuntu 22.04 или серверу разработки от имени пользователя без полномочий root с привилегиями sudo. Если вы используете удаленный сервер, желательно установить активный брандмауэр. Чтобы настроить их, обратитесь к нашему Руководству по первоначальной настройке сервера для Ubuntu 22.04.
  • Docker установлен на вашем сервере, следуя шагам 1 и 2 статьи «Как установить и использовать Docker в Ubuntu 22.04».
  • Docker Compose установлен на вашем сервере, следуя шагу 1 инструкции по установке и использованию Docker Compose в Ubuntu 22.04.

Шаг 1 — Получение демо-приложения

Для начала мы получим демо-приложение Laravel из репозитория Github. Нас интересует ветка tutorial-01 , которая содержит базовое приложение Laravel, созданное нами в первом руководстве этой серии.

Чтобы получить код приложения, совместимый с этим руководством, загрузите версию tutorial-1.0.1 в свой домашний каталог с помощью:

Для распаковки кода приложения нам понадобится команда unzip . Если вы еще не установили этот пакет раньше, сделайте это сейчас с помощью:

Теперь разархивируйте содержимое приложения и переименуйте распакованный каталог для облегчения доступа:

Перейдите в каталог travellist-demo :

На следующем шаге мы создадим файл конфигурации .env для настройки приложения.

Шаг 2. Настройка файла .env приложения.

Файлы конфигурации Laravel расположены в каталоге config внутри корневого каталога приложения. Кроме того, файл .env используется для настройки конфигурации, зависящей от среды, например учетных данных и любой информации, которая может различаться в зависимости от развертывания. Этот файл не включен в контроль версий.

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

Значения, содержащиеся в файле .env будут иметь приоритет над значениями, установленными в обычных файлах конфигурации, расположенных в каталоге config . Для каждой установки в новой среде требуется специальный файл среды, в котором определяются такие параметры, как параметры подключения к базе данных, параметры отладки, URL-адрес приложения, а также другие элементы, которые могут различаться в зависимости от среды, в которой работает приложение.

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

Откройте этот файл с помощью nano или текстового редактора по вашему выбору:

Текущий файл .env из демонстрационного приложения travellist содержит настройки для использования локальной базы данных MySQL с 127.0.0.1 в качестве хоста базы данных. Нам нужно обновить переменную DB_HOST , чтобы она указывала на службу базы данных, которую мы создадим в нашей среде Docker. В этом руководстве мы будем называть нашу службу базы данных db . Идем дальше и заменяем указанное значение DB_HOST именем службы базы данных:

.env

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

Сохраните файл, когда закончите редактирование. Если вы использовали nano , вы можете сделать это, нажав Ctrl+x , затем Y и Enter для подтверждения.

Шаг 3 — Настройка Dockerfile приложения

Хотя наши службы MySQL и Nginx будут основаны на образах по умолчанию, полученных из Docker Hub, нам все равно необходимо создать собственный образ для контейнера приложения. Для этого мы создадим новый Dockerfile.

Наш образ travellist будет основан на официальном образе php:7.4-fpm из Docker Hub. Поверх этой базовой среды PHP-FPM мы установим несколько дополнительных модулей PHP и инструмент управления зависимостями Composer.

Мы также создадим нового системного пользователя; это необходимо для выполнения команд artisan и composer во время разработки приложения. Параметр uid гарантирует, что пользователь внутри контейнера будет иметь тот же uid, что и пользователь вашей системы на вашем хост-компьютере, где вы запускаете Docker. Таким образом, любые файлы, созданные этими командами, реплицируются на хосте с правильными разрешениями. Это также означает, что вы сможете использовать выбранный вами редактор кода на хост-компьютере для разработки приложения, работающего внутри контейнеров.

Создайте новый Dockerfile с помощью:

Скопируйте следующее содержимое в свой Dockerfile:

Докерфайл

Не забудьте сохранить файл, когда закончите.

Наш Dockerfile начинается с определения используемого нами базового образа: php:7.4-fpm .

После установки системных пакетов и расширений PHP мы устанавливаем Composer, копируя исполняемый файл composer из его последнего официального образа в наш собственный образ приложения.

Затем создается и настраивается новый системный пользователь с использованием аргументов user и uid , которые были объявлены в начале Dockerfile. Эти значения будут введены Docker Compose во время сборки.

Наконец, мы устанавливаем рабочий каталог по умолчанию как /var/www и переходим к вновь созданному пользователю. Это позволит убедиться, что вы подключаетесь как обычный пользователь и находитесь в правильном каталоге при запуске команд composer и artisan в контейнере приложения.

Шаг 4 — Настройка файлов конфигурации Nginx и дампа базы данных

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

Теперь мы создадим папку с файлами, которые будут использоваться для настройки и инициализации наших сервисных контейнеров.

Чтобы настроить Nginx, мы предоставим файл travellist.conf , который будет настраивать способ обслуживания приложения. Создайте папку docker-compose/nginx с помощью:

Откройте новый файл с именем travellist.conf в этом каталоге:

Скопируйте в этот файл следующую конфигурацию Nginx:

docker-compose/nginx/travellist.conf

Этот файл настроит Nginx на прослушивание порта 80 и использование index.php в качестве индексной страницы по умолчанию. Он установит корень документа в /var/www/public , а затем настроит Nginx на использование службы app на порту 9000 для обработки файлов *.php .

Сохраните и закройте файл, когда закончите редактирование.

Чтобы настроить базу данных MySQL, мы предоставим дамп базы данных, который будет импортирован при инициализации контейнера. Это функция, предоставляемая образом MySQL 5.7, который мы будем использовать в этом контейнере.

Создайте новую папку для файлов инициализации MySQL внутри папки docker-compose :

Откройте новый файл .sql :

Следующий дамп MySQL основан на базе данных, которую мы настроили в нашем руководстве по Laravel на LEMP. Будет создана новая таблица с именем places . Затем он заполнит таблицу набором образцов мест.

Добавьте в файл следующий код:

docker-compose/mysql/db_init.sql

Таблица places содержит три поля: id , name и visited . Поле visited — это флаг, используемый для обозначения мест, которые еще предстоит посетить. Не стесняйтесь менять места в примерах или включать новые. Сохраните и закройте файл, когда закончите.

Мы завершили настройку Dockerfile приложения и файлов конфигурации службы. Далее мы настроим Docker Compose для использования этих файлов при создании наших сервисов.

Шаг 5. Создание многоконтейнерной среды с помощью Docker Compose

Docker Compose позволяет создавать многоконтейнерные среды для приложений, работающих на Docker. Он использует определения сервисов для создания полностью настраиваемых сред с несколькими контейнерами, которые могут совместно использовать сети и объемы данных. Это обеспечивает плавную интеграцию между компонентами приложения.

Чтобы настроить определения наших сервисов, мы создадим новый файл с именем docker-compose.yml . Обычно этот файл находится в корне папки приложения и определяет вашу контейнерную среду, включая базовые образы, которые вы будете использовать для создания контейнеров, и способы взаимодействия ваших сервисов.

В нашем файле docker-compose.yml мы определим три разных сервиса: app , db и nginx .

Служба app создаст образ с именем travellist на основе ранее созданного файла Dockerfile. Контейнер, определенный этой службой, будет запускать сервер php-fpm для анализа PHP-кода и отправки результатов обратно в службу nginx , которая будет работать в отдельном контейнере. Служба mysql определяет контейнер, на котором работает сервер MySQL 5.7. Наши службы будут использовать мостовую сеть под названием travellist .

Файлы приложения будут синхронизироваться как в app , так и в службах nginx посредством bind mounts . Привязка монтирования полезна в средах разработки, поскольку обеспечивает эффективную двустороннюю синхронизацию между хост-компьютером и контейнерами.

Создайте новый файл docker-compose.yml в корне папки приложения:

Типичный файл docker-compose.yml начинается с определения версии, за которым следует узел services , в котором определены все службы. Общие сети обычно определяются в нижней части этого файла.

Для начала скопируйте этот шаблонный код в файл docker-compose.yml :

docker-compose.yml

Теперь мы отредактируем узел services , включив в него службы app , db и nginx .

Служба app

Служба app настроит контейнер с именем travellist-app . Он создает новый образ Docker на основе файла Dockerfile, расположенного по тому же пути, что и файл docker-compose.yml . Новое изображение будет сохранено локально под именем travellist .

Несмотря на то, что корень документа, который используется в качестве приложения, расположен в контейнере nginx , нам также нужны файлы приложения где-то внутри контейнера app , чтобы мы могли выполнять задачи командной строки с помощью инструмента Laravel Artisan.

Скопируйте следующее определение службы в свой узел services внутри файла docker-compose.yml :

docker-compose.yml

Эти настройки делают следующее:

  • build : эта конфигурация указывает Docker Compose создать локальный образ для службы app , используя указанный путь (контекст) и Dockerfile для инструкций. Аргументы user и uid вводятся в Dockerfile для настройки команд создания пользователей во время сборки.
  • image : имя, которое будет использоваться для создаваемого образа.
  • container_name : устанавливает имя контейнера для этой службы.
  • restart : Всегда перезапускать, если служба не остановлена.
  • working_dir : устанавливает каталог по умолчанию для этой службы как /var/www .
  • volumes : создает общий том, который будет синхронизировать содержимое текущего каталога с /var/www внутри контейнера. Обратите внимание, что это не корень вашего документа, поскольку он будет находиться в контейнере nginx .
  • networks : настраивает эту службу для использования сети с именем travellist .

Служба db

Служба db использует предварительно созданный образ MySQL 8.0 из Docker Hub. Поскольку Docker Compose автоматически загружает файлы переменных .env расположенные в том же каталоге, что и файл docker-compose.yml , мы можем получить настройки нашей базы данных из файла .env Laravel, который мы создали на предыдущем шаге.

Включите следующее определение службы в свой узел services сразу после службы app :

docker-compose.yml

Эти настройки делают следующее:

  • image : определяет образ Docker, который следует использовать для этого контейнера. В данном случае мы используем образ MySQL 5.7 из Docker Hub.
  • container_name : устанавливает имя контейнера для этой службы: travellist-db .
  • restart : всегда перезапускать эту службу, если она не остановлена явно.
  • environment : определяет переменные среды в новом контейнере. Мы используем значения, полученные из файла .env Laravel, для настройки нашей службы MySQL, которая автоматически создаст новую базу данных и пользователя на основе предоставленных переменных среды.
  • volumes : создает том для совместного использования дампа базы данных .sql , который будет использоваться для инициализации базы данных приложения. Образ MySQL автоматически импортирует файлы .sql , помещенные в каталог /docker-entrypoint-initdb.d внутри контейнера.
  • networks : настраивает эту службу для использования сети с именем travellist .

Служба nginx

Служба nginx использует предварительно созданный образ Nginx поверх Alpine, облегченного дистрибутива Linux. Он создает контейнер с именем travellist-nginx и использует определение ports для создания перенаправления с порта 8000 в хост-системе на порт 80 внутри контейнера.

Включите следующее определение службы в свой узел services сразу после службы db :

docker-compose.yml

Эти настройки делают следующее:

  • image : определяет образ Docker, который следует использовать для этого контейнера. В данном случае мы используем образ Alpine Nginx 1.17.
  • container_name : устанавливает имя контейнера для этой службы: travellist-nginx .
  • restart : всегда перезапускать эту службу, если она не остановлена явно.
  • ports : устанавливает перенаправление портов, которое позволит внешний доступ через порт 8000 к веб-серверу, работающему на порту 80 внутри контейнера.
  • volumes : Создает two общих тома. Первый синхронизирует содержимое текущего каталога с /var/www внутри контейнера. Таким образом, когда вы вносите локальные изменения в файлы приложения, они быстро отражаются в приложении, обслуживаемом Nginx внутри контейнера. Второй том обеспечит копирование нашего файла конфигурации Nginx, расположенного по адресу docker-compose/nginx/travellist.conf , в папку конфигурации Nginx контейнера.
  • networks : настраивает эту службу для использования сети с именем travellist .

Готовый файл docker-compose.yml

Вот как выглядит наш готовый файл docker-compose.yml :

docker-compose.yml

Обязательно сохраните файл, когда закончите.

Шаг 6 — Запуск приложения с помощью Docker Compose

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

Создайте образ app с помощью следующей команды:

Выполнение этой команды может занять несколько минут. Вы увидите вывод, похожий на этот:

Когда сборка завершена, вы можете запустить среду в фоновом режиме с помощью:

Это запустит ваши контейнеры в фоновом режиме. Чтобы просмотреть информацию о состоянии ваших активных служб, запустите:

Вы увидите такой вывод:

Теперь ваша среда запущена и работает, но нам все еще нужно выполнить пару команд, чтобы завершить настройку приложения. Вы можете использовать команду docker-compose exec для выполнения команд в сервисных контейнерах, например ls -l для отображения подробной информации о файлах в каталоге приложения:

Теперь мы запустим composer install , чтобы установить зависимости приложения:

Вы увидите такой вывод:

Последнее, что нам нужно сделать перед тестированием приложения, — это сгенерировать уникальный ключ приложения с помощью инструмента командной строки artisan Laravel. Этот ключ используется для шифрования пользовательских сеансов и других конфиденциальных данных:

Теперь зайдите в браузер и получите доступ к доменному имени или IP-адресу вашего сервера через порт 8000:

Note . Если вы запускаете эту демонстрацию на своем локальном компьютере, используйте http://localhost:8000 для доступа к приложению из браузера.

Вы увидите такую страницу:

Демо-приложение Laravel

Вы можете использовать команду logs для проверки журналов, созданных вашими сервисами:

Если вы хотите приостановить работу среды Docker Compose, сохранив при этом состояние всех ее служб, запустите:

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

Чтобы завершить работу среды Docker Compose и удалить все ее контейнеры, сети и тома, выполните:

Обзор всех команд Docker Compose см. в справочнике по командной строке Docker Compose.

Заключение

В этом руководстве мы настроили среду Docker с тремя контейнерами, используя Docker Compose, чтобы определить нашу инфраструктуру в файле YAML.

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