Введение

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

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

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

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

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

docker compose illustration for: Предварительные требования
  • Доступ к локальному компьютеру или серверу разработки с Ubuntu 18.04 от имени пользователя sudo без привилегий root. Если вы используете удаленный сервер, рекомендуется установить активный брандмауэр. Для настройки следует использовать Руководство по начальной настройке сервера на Ubuntu 18.04.

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

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

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

				
					
cd ~

curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

				
			

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

				
					
sudo apt update

sudo apt install unzip

				
			

Теперь распакуйте содержимое приложения и переименуйте распакованную директорию для удобства доступа:

				
					
unzip travellist.zip

mv travellist-laravel-demo-tutorial-1.0.1 <^>travellist-demo<^>

				
			

Перейдите в директорию travellist-demo:

				
					
cd travellist-demo

				
			

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

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

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

[warning]

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

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

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

				
					
cp .env.example .env

				
			

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

				
					
nano .env

				
			

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

				
					
[label .env]

APP_NAME=Travellist

APP_ENV=dev

APP_KEY=

APP_DEBUG=true

APP_URL=http://localhost:8000



LOG_CHANNEL=stack



DB_CONNECTION=mysql

DB_HOST=<^>db<^>

DB_PORT=3306

DB_DATABASE=<^>travellist<^>

DB_USERNAME=<^>travellist_user<^>

DB_PASSWORD=<^>password<^>

...

				
			

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

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

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

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

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

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

Создайте новый файл Dockerfile:

				
					
nano Dockerfile

				
			

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

				
					
[label Dockerfile]

FROM php:7.4-fpm



# Arguments defined in docker-compose.yml

ARG user

ARG uid



# Install system dependencies

RUN apt-get update && apt-get install -y \

 git \

 curl \

 libpng-dev \

 libonig-dev \

 libxml2-dev \

 zip \

 unzip



# Clear cache

RUN apt-get clean && rm -rf /var/lib/apt/lists/*



# Install PHP extensions

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd



# Get latest Composer

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer



# Create system user to run Composer and Artisan Commands

RUN useradd -G www-data,root -u $uid -d /home/$user $user

RUN mkdir -p /home/$user/.composer && \

 chown -R $user:$user /home/$user



# Set working directory

WORKDIR /var/www



USER $user



				
			

Не забудьте сохранить файл после завершения работы.

Вначале наш файл 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 с помощью следующей команды:

				
					
mkdir -p docker-compose/nginx

				
			

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

				
					
nano docker-compose/nginx/travellist.conf

				
			

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

				
					
[label docker-compose/nginx/travellist.conf]



server {

 listen 80;

 index index.php index.html;

 error_log /var/log/nginx/error.log;

 access_log /var/log/nginx/access.log;

 root /var/www/public;

 location ~ \.php$ {

 try_files $uri =404;

 fastcgi_split_path_info ^(.+\.php)(/.+)$;

 fastcgi_pass app:9000;

 fastcgi_index index.php;

 include fastcgi_params;

 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

 fastcgi_param PATH_INFO $fastcgi_path_info;

 }

 location / {

 try_files $uri $uri/ /index.php?$query_string;

 gzip_static on;

 }

}

				
			

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

Сохраните и закройте файл после завершения редактирования.

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

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

				
					
mkdir docker-compose/mysql

				
			

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

				
					
nano docker-compose/mysql/init_db.sql

				
			

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

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

				
					
[label docker-compose/mysql/db_init.sql]

DROP TABLE IF EXISTS `places`;



CREATE TABLE `places` (

 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

 `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,

 `visited` tinyint(1) NOT NULL DEFAULT '0',

 PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);

				
			

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

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

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

				
					
nano docker-compose.yml

				
			

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

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

				
					
[label docker-compose.yml]

version: "3.7"

services:





networks:

 <^>travellist<^>:

 driver: bridge

				
			

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

Служба app

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

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

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

				
					
[label docker-compose.yml]

 app:

 build:

 args:

 user: <^>sammy<^>

 uid: <^>1000<^>

 context: ./

 dockerfile: Dockerfile

 image: <^>travellist<^>

 container_name: <^>travellist-app<^>

 restart: unless-stopped

 working_dir: /var/www/

 volumes:

 - <^>./:/var/www<^>

 networks:

 - <^>travellist<^>

				
			

Эти параметры имеют следующее назначение:

  • 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 5.7 из Docker Hub. Поскольку Docker Compose автоматически загружает файлы переменных .env, находящиеся в той же директории, что и файл docker-compose.yml, мы можем получить параметры базы данных из файла Laravel .env, созданного на предыдущем шаге.

Добавьте следующее определение служб в узел services сразу же после определения службы app:

				
					
[label docker-compose.yml]

 db:

 image: <^>mysql:5.7<^>

 container_name: <^>travellist-db<^>

 restart: unless-stopped

 environment:

 MYSQL_DATABASE: <^>${DB_DATABASE}<^>

 MYSQL_ROOT_PASSWORD: <^>${DB_PASSWORD}<^>

 MYSQL_PASSWORD: <^>${DB_PASSWORD}<^>

 MYSQL_USER: <^>${DB_USERNAME}<^>

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 volumes:

 - <^>./docker-compose/mysql:/docker-entrypoint-initdb.d<^>

 networks:

 - travellist

				
			

Эти параметры имеют следующее назначение:

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

Служба nginx

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

Добавьте следующее определение службы в узел services сразу после службы db:

				
					
[label docker-compose.yml]

 nginx:

 image: <^>nginx:1.17-alpine<^>

 container_name: <^>travellist-nginx<^>

 restart: unless-stopped

 ports:

 - <^>8000:80<^>

 volumes:

 - <^>./:/var/www<^>

 - <^>./docker-compose/nginx:/etc/nginx/conf.d<^>

 networks:

 - travellist

				
			

Эти параметры имеют следующее назначение:

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

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

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

				
					
[label docker-compose.yml]

version: "3.7"

services:

 <^>app<^>:

 build:

 args:

 user: sammy

 uid: 1000

 context: ./

 dockerfile: Dockerfile

 image: travellist

 container_name: <^>travellist-app<^>

 restart: unless-stopped

 working_dir: /var/www/

 volumes:

 - ./:/var/www

 networks:

 - travellist



 <^>db<^>:

 image: mysql:5.7

 container_name: <^>travellist-db<^>

 restart: unless-stopped

 environment:

 MYSQL_DATABASE: ${DB_DATABASE}

 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

 MYSQL_PASSWORD: ${DB_PASSWORD}

 MYSQL_USER: ${DB_USERNAME}

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 volumes:

 - ./docker-compose/mysql:/docker-entrypoint-initdb.d

 networks:

 - travellist



 <^>nginx<^>:

 image: nginx:alpine

 container_name: <^>travellist-nginx<^>

 restart: unless-stopped

 ports:

 - 8000:80

 volumes:

 - ./:/var/www

 - ./docker-compose/nginx:/etc/nginx/conf.d/

 networks:

 - travellist



networks:

 travellist:

 driver: bridge

				
			

Обязательно сохраните файл после завершения.

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

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

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

				
					
docker-compose build app

				
			

Выполнение этой команды может занять несколько минут. Вывод будет выглядеть следующим образом:

				
					
[secondary_label Output]

Building app

Step 1/11 : FROM php:7.4-fpm

 ---> fa37bd6db22a

Step 2/11 : ARG user

 ---> Running in f71eb33b7459

Removing intermediate container f71eb33b7459

 ---> 533c30216f34

Step 3/11 : ARG uid

 ---> Running in 60d2d2a84cda

Removing intermediate container 60d2d2a84cda

 ---> 497fbf904605

Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev ...

Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

 ---> e499f74896e3

Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user

 ---> Running in 232ef9c7dbd1

Removing intermediate container 232ef9c7dbd1

 ---> 870fa3220ffa

Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user

 ---> Running in 7ca8c0cb7f09

Removing intermediate container 7ca8c0cb7f09

 ---> 3d2ef9519a8e

Step 10/11 : WORKDIR /var/www

 ---> Running in 4a964f91edfa

Removing intermediate container 4a964f91edfa

 ---> 00ada639da21

Step 11/11 : USER $user

 ---> Running in 9f8e874fede9

Removing intermediate container 9f8e874fede9

 ---> fe176ff4702b



Successfully built fe176ff4702b

Successfully tagged travellist:latest



				
			

После завершения сборки вы можете запустить среду в фоновом режиме с помощью следующей команды:

				
					
docker-compose up -d

				
			
				
					
[secondary_label Output]

Creating travellist-db ... done

Creating travellist-app ... done

Creating travellist-nginx ... done

				
			

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

				
					
docker-compose ps

				
			

Вывод будет выглядеть следующим образом:

				
					
[secondary_label Output]

 Name Command State Ports 

-------------------------------------------------------------------------------

<^>travellist-app<^> docker-php-entrypoint php-fpm Up 9000/tcp 

<^>travellist-db<^> docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp

<^>travellist-nginx<^> nginx -g daemon off; Up 0.0.0.0:8000->80/tcp

				
			

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

				
					
docker-compose exec <^>app<^> <^>ls -l<^>

				
			
				
					
[secondary_label Output]

total 256

-rw-rw-r-- 1 sammy 1001 738 Jan 15 16:46 Dockerfile

-rw-rw-r-- 1 sammy 1001 101 Jan 7 08:05 README.md

drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 app

-rwxr-xr-x 1 sammy 1001 1686 Jan 7 08:05 artisan

drwxrwxr-x 3 sammy 1001 4096 Jan 7 08:05 bootstrap

-rw-rw-r-- 1 sammy 1001 1501 Jan 7 08:05 composer.json

-rw-rw-r-- 1 sammy 1001 179071 Jan 7 08:05 composer.lock

drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 config

drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 database

drwxrwxr-x 4 sammy 1001 4096 Jan 15 16:46 docker-compose

-rw-rw-r-- 1 sammy 1001 1015 Jan 15 16:45 docker-compose.yml

-rw-rw-r-- 1 sammy 1001 1013 Jan 7 08:05 package.json

-rw-rw-r-- 1 sammy 1001 1405 Jan 7 08:05 phpunit.xml

drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 public

-rw-rw-r-- 1 sammy 1001 273 Jan 7 08:05 readme.md

drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 resources

drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 routes

-rw-rw-r-- 1 sammy 1001 563 Jan 7 08:05 server.php

drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 storage

drwxrwxr-x 4 sammy 1001 4096 Jan 7 08:05 tests

-rw-rw-r-- 1 sammy 1001 538 Jan 7 08:05 webpack.mix.js

				
			

Теперь мы выполним команду composer install для установки зависимостей приложения:

				
					
docker-compose exec app <^>composer install<^>

				
			

Вывод будет выглядеть следующим образом:

				
					
[secondary_label Output]

Loading composer repositories with package information

Installing dependencies (including require-dev) from lock file

Package operations: 85 installs, 0 updates, 0 removals

 - Installing doctrine/inflector (1.3.1): Downloading (100%) 

 - Installing doctrine/lexer (1.2.0): Downloading (100%) 

 - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) 

 - Installing erusev/parsedown (1.7.4): Downloading (100%) 

 - Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%) 

 - Installing phpoption/phpoption (1.7.2): Downloading (100%) 

 - Installing vlucas/phpdotenv (v3.6.0): Downloading (100%) 

 - Installing symfony/css-selector (v5.0.2): Downloading (100%) 

…

Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump

> @php artisan package:discover --ansi

Discovered Package: facade/ignition

Discovered Package: fideloper/proxy

Discovered Package: laravel/tinker

Discovered Package: nesbot/carbon

Discovered Package: nunomaduro/collision

Package manifest generated successfully.

				
			

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

				
					
docker-compose exec app <^>php artisan key:generate<^>

				
			
				
					
[secondary_label Output]

Application key set successfully.

				
			

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

				
					
http://server_domain_or_IP:8000

				
			

Страница будет выглядеть следующим образом:

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

				
					
docker-compose logs <^>nginx<^>

				
			
				
					
Attaching to <^>travellist-nginx<^>

travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:25 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"

travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:26 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"

travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:42 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"

…

				
			

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

				
					
docker-compose pause

				
			
				
					
[secondary_label Output]

Pausing travellist-db ... done

Pausing travellist-nginx ... done

Pausing travellist-app ... done

				
			

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

				
					
docker-compose unpause

				
			
				
					
[secondary_label Output]

Unpausing travellist-app ... done

Unpausing travellist-nginx ... done

Unpausing travellist-db ... done

				
			

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

				
					
docker-compose down

				
			
				
					
[secondary_label Output]

Stopping travellist-nginx ... done

Stopping travellist-db ... done

Stopping travellist-app ... done

Removing travellist-nginx ... done

Removing travellist-db ... done

Removing travellist-app ... done

Removing network travellist-laravel-demo_travellist

				
			

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

Заключение

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

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