Введение
Контейнеризация приложения — это процесс адаптации приложения и его компонентов для возможности запуска его в облегченных средах, известных как контейнеры. Такие среды изолированы и одноразовые, и их можно использовать для разработки, тестирования и развертывания приложений в рабочей среде.
В этом руководстве мы будем использовать 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
в свой домашний каталог с помощью:
1 |
<ol><li data-prefix="$"> <span class="token builtin class-name">компакт-диск</span> ~</li><li data-prefix="$"> <span class="token function">завиток</span> <span class="token parameter variable">-L</span> https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip <span class="token parameter variable">-o</span> travellist.zip</li></ol> |
Для распаковки кода приложения нам понадобится команда unzip
. Если вы еще не установили этот пакет раньше, сделайте это сейчас с помощью:
1
<ol><li data-prefix="$"> обновление <span class="token function">sudo</span> <span class="token function">apt</span></li><li data-prefix="$"> <span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">установить</span> <span class="token function">разархивировать</span></li></ol>
Теперь разархивируйте содержимое приложения и переименуйте распакованный каталог для облегчения доступа:
1
<ol><li data-prefix="$"> <span class="token function">разархивируйте</span> файл travellist.zip</li><li data-prefix="$"> <span class="token function">mv</span> travellist-laravel-demo-tutorial-1.0.1<mark> Travellist-демо</mark></li></ol>
Перейдите в каталог travellist-demo
:
1
<ol><li data-prefix="$"> <span class="token builtin class-name">компакт-диск</span> Travellist-демо</li></ol>
На следующем шаге мы создадим файл конфигурации .env
для настройки приложения.
Шаг 2. Настройка файла .env
приложения.
Файлы конфигурации Laravel расположены в каталоге config
внутри корневого каталога приложения. Кроме того, файл .env
используется для настройки конфигурации, зависящей от среды, например учетных данных и любой информации, которая может различаться в зависимости от развертывания. Этот файл не включен в контроль версий.
Warning . Файл конфигурации среды содержит конфиденциальную информацию о вашем сервере, включая учетные данные базы данных и ключи безопасности. По этой причине вам никогда не следует публиковать этот файл публично.
Значения, содержащиеся в файле .env
будут иметь приоритет над значениями, установленными в обычных файлах конфигурации, расположенных в каталоге config
. Для каждой установки в новой среде требуется специальный файл среды, в котором определяются такие параметры, как параметры подключения к базе данных, параметры отладки, URL-адрес приложения, а также другие элементы, которые могут различаться в зависимости от среды, в которой работает приложение.
Теперь мы создадим новый файл .env
для настройки параметров конфигурации среды разработки, которую мы настраиваем. Laravel поставляется с примером файла .env
, который мы можем скопировать, чтобы создать свой собственный:
1
<ol><li data-prefix="$"> <span class="token function">cp</span> .env.example .env</li></ol>
Откройте этот файл с помощью nano
или текстового редактора по вашему выбору:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> .env</li></ol>
Текущий файл .env
из демонстрационного приложения travellist
содержит настройки для использования локальной базы данных MySQL с 127.0.0.1
в качестве хоста базы данных. Нам нужно обновить переменную DB_HOST
, чтобы она указывала на службу базы данных, которую мы создадим в нашей среде Docker. В этом руководстве мы будем называть нашу службу базы данных db
. Идем дальше и заменяем указанное значение DB_HOST
именем службы базы данных:
.env
1
APP_NAME=Travellist APP_ENV=dev APP_KEY= APP_DEBUG=true APP_URL=http://localhost:8000 LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=</code> db DB_PORT=3306 DB_DATABASE=<mark> список путешествий</mark> DB_USERNAME=<mark> travellist_user</mark> БД_ПАРОЛЬ=<mark> пароль</mark> ...
При желании вы также можете изменить имя базы данных, имя пользователя и пароль. Эти переменные будут использованы на следующем этапе, когда мы настроим файл 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 с помощью:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> Dockerfile</li></ol>
Скопируйте следующее содержимое в свой Dockerfile:
Докерфайл
1
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
с помощью:
1
<ol><li data-prefix="$"> <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> docker-compose/nginx</li></ol>
Откройте новый файл с именем travellist.conf
в этом каталоге:
1
<ol><li data-prefix="$"> <span class="token function">nano</span> docker-compose/nginx/travellist.conf</li></ol>
Скопируйте в этот файл следующую конфигурацию Nginx:
docker-compose/nginx/travellist.conf
1
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
:
1
<ol><li data-prefix="$"> <span class="token function">mkdir</span> docker-compose/mysql</li></ol>
Откройте новый файл .sql
:
1
<ol><li data-prefix="$"> <span class="token function">nano</span> docker-compose/mysql/init_db.sql</li></ol>
Следующий дамп MySQL основан на базе данных, которую мы настроили в нашем руководстве по Laravel на LEMP. Будет создана новая таблица с именем places
. Затем он заполнит таблицу набором образцов мест.
Добавьте в файл следующий код:
docker-compose/mysql/db_init.sql
1
<span class="token keyword">DROP</span> <span class="token keyword">TABLE</span> <span class="token keyword">IF</span> <span class="token keyword">EXISTS</span> <span class="token identifier"><span class="token punctuation">`</span> places <span class="token punctuation">`</span></span> <span class="token punctuation">;</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token identifier"><span class="token punctuation">`</span> places <span class="token punctuation">`</span></span> <span class="token punctuation">(</span> <span class="token identifier"><span class="token punctuation">`</span> id <span class="token punctuation">`</span></span> <span class="token keyword">bigint</span> <span class="token punctuation">(</span> <span class="token number">20</span> <span class="token punctuation">)</span> <span class="token keyword">unsigned</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span> name <span class="token punctuation">`</span></span> <span class="token keyword">varchar</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token keyword">COLLATE</span> utf8mb4_unicode_ci <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span> visited <span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token string">'0'</span> <span class="token punctuation">,</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span> <span class="token identifier"><span class="token punctuation">`</span> id <span class="token punctuation">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">ENGINE</span> <span class="token operator">=</span> <span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token operator">=</span> <span class="token number">12</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CHARSET</span> <span class="token operator">=</span> utf8mb4 <span class="token keyword">COLLATE</span> <span class="token operator">=</span> utf8mb4_unicode_ci <span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token identifier"><span class="token punctuation">`</span> places <span class="token punctuation">`</span></span> <span class="token punctuation">(</span> name <span class="token punctuation">,</span> visited <span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span> <span class="token string">'Berlin'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Budapest'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Cincinnati'</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Denver'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Helsinki'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Lisbon'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Moscow'</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Nairobi'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Oslo'</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Rio'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token string">'Tokyo'</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
Таблица 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
в корне папки приложения:
1
<ol><li data-prefix="$"> <span class="token function">нано</span> docker-compose.yml</li></ol>
Типичный файл docker-compose.yml
начинается с определения версии, за которым следует узел services
, в котором определены все службы. Общие сети обычно определяются в нижней части этого файла.
Для начала скопируйте этот шаблонный код в файл docker-compose.yml
:
docker-compose.yml
1
version: "3.7" services: networks:</code> Travellist : водитель: мост
Теперь мы отредактируем узел 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
1
app: build: args: user:</code> Сэмми идентификатор:<mark> 1000</mark> контекст: ./ dockerfile: Изображение Dockerfile:<mark> список путешествий</mark> имя_контейнера:<mark> приложение Travellist</mark> перезапуск: если не остановлен рабочий_каталог: /var/www/ тома: -<mark> ./:/вар/www</mark> сети: -<mark> список путешествий</mark>
Эти настройки делают следующее:
-
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
1
db: image:</code> MySQL: 8.0 имя_контейнера:<mark> Travellist-БД</mark> перезапуск: если не остановлена среда: MYSQL_DATABASE:<mark> ${DB_DATABASE}</mark> MYSQL_ROOT_PASSWORD:<mark> ${DB_PASSWORD}</mark> МYSQL_ПАРОЛЬ:<mark> ${DB_PASSWORD}</mark> МYSQL_USER:<mark> ${DB_USERNAME}</mark> SERVICE_TAGS: dev SERVICE_NAME: тома MySQL: -<mark> ./docker-compose/mysql:/docker-entrypoint-initdb.d</mark> сети: - список путешествий
Эти настройки делают следующее:
-
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
1
nginx: image:</code> nginx:1.17-alpine имя_контейнера:<mark> Travellist-nginx</mark> перезапуск: если не остановлены порты: -<mark> 8000:80</mark> объемы: -<mark> ./:/вар/www</mark> -<mark> ./docker-compose/nginx:/etc/nginx/conf.d</mark> сети: - список путешествий
Эти настройки делают следующее:
-
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
1
version: "3.7" services:</code> приложение : build: args: пользователь: sammy uid: 1000 контекст: ./ dockerfile: образ Dockerfile: travellist имя_контейнера:<mark> приложение Travellist</mark> перезапуск: если не остановлен, рабочий_каталог: /var/www/ тома: - ./:/var/www сети: - список путешествий<mark> БД</mark> : изображение: mysql:8.0 имя_контейнера:<mark> Travellist-БД</mark> перезапуск: если не остановлена среда: 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 сети: - список путешествий<mark> nginx</mark> : image: nginx:alpine имя_контейнера:<mark> Travellist-nginx</mark> перезапуск: если не остановлены порты: - 8000:80 тома: - ./:/var/www - ./docker-compose/nginx:/etc/nginx/conf.d/ network: - сети travellist: travellist: driver: Bridge
Обязательно сохраните файл, когда закончите.
Шаг 6 — Запуск приложения с помощью Docker Compose
Теперь мы будем использовать команды docker-compose
для создания образа приложения и запуска сервисов, указанных в нашей настройке.
Создайте образ app
с помощью следующей команды:
1
<ol><li data-prefix="$"> приложение для сборки <span class="token function">docker-compose</span></li></ol>
Выполнение этой команды может занять несколько минут. Вы увидите вывод, похожий на этот:
1
<div class="secondary-code-label" title="Выход"> Выход</div> Сборка приложения Отправка контекста сборки демону Docker 377,3 КБ Шаг 1/11: FROM php:7.4-fpm ---> 8c08d993542f Шаг 2/11: Пользователь ARG ---> e3ce3af04d87 Шаг 3/11: ARG uid ---> 30cb921ef7df Шаг 4 из 11: ЗАПУСТИТЕ apt-get update && apt-get install -y git curl libpng-dev libonig-dev libxml2-dev zip unzip. . . ---> b6dbc7a02e95 Шаг 5 из 11: ВЫПОЛНИТЕ apt-get clean && rm -rf /var/lib/apt/lists/* ---> 10ef9dde45ad . . . Шаг 6/11: ЗАПУСТИТЕ docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd. . . ---> 920e4f09ec75 Шаг 7/11: КОПИРОВАТЬ --from=composer:latest /usr/bin/composer /usr/bin/composer ---> dbbcd44e44af Шаг 8/11: ВЫПОЛНИТЬ useradd -G www-data,root - u $uid -d /home/$user $user ---> db98e899a69a Шаг 9 из 11: RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user -- -> 5119e26ebfea Шаг 10/11: WORKDIR /var/www ---> 699c491611c0 Шаг 11/11: ПОЛЬЗОВАТЕЛЬ $user ---> cf250fe8f1af Успешно создан cf250fe8f1af Успешно отмечен список путешествий: последний
Когда сборка завершена, вы можете запустить среду в фоновом режиме с помощью:
1
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Создание travellist-db... готово Создание travellist-app... готово Создание travellist-nginx... готово
Это запустит ваши контейнеры в фоновом режиме. Чтобы просмотреть информацию о состоянии ваших активных служб, запустите:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> <span class="token function">PS</span></li></ol>
Вы увидите такой вывод:
1
<div class="secondary-code-label" title="Выход"> Выход</div> Имя Команда Состояние Порты ---------------------------------------------- ------------------------------------------------- список путешествий -app docker-php-entrypoint php-fpm Up 9000/tcp travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp travellist-nginx nginx -g демон выключен; Вверх 0.0.0.0:8000->80/tcp,:::8000->80/tcp
Теперь ваша среда запущена и работает, но нам все еще нужно выполнить пару команд, чтобы завершить настройку приложения. Вы можете использовать команду docker-compose exec
для выполнения команд в сервисных контейнерах, например ls -l
для отображения подробной информации о файлах в каталоге приложения:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> <span class="token builtin class-name">exec</span><mark> приложение</mark><mark> <span class="token function">лс</span> <span class="token parameter variable">-л</span></mark></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> всего 256 -rw-r--r-- 1 Сэмми Сэмми 737 18 апреля 14:21 Dockerfile -rw-r--r-- 1 Сэмми Сэмми 101 7 января 2020 г. README.md drwxr-xr-x 6 Сэмми Сэмми 4096 Янв. 7 Приложение 2020 г. -rwxr-xr-x 1 Сэмми Сэмми 1686 7 января 2020 г. artisan drwxr-xr-x 3 Сэмми Сэмми 4096 7 января 2020 г. Bootstrap -rw-r--r-- 1 Сэмми Сэмми 1501 7 января 2020 г. композитор.json - rw-r--r-- 1 Сэмми Сэмми 179071 7 января 2020 г. композитор.lock drwxr-xr-x 2 Сэмми Сэмми 4096 7 января 2020 г. config drwxr-xr-x 5 Сэмми Сэмми 4096 7 января 2020 г. база данных drwxr-xr-x 4 Сэмми Сэмми 4096 18 апреля 14:22 docker-compose -rw-r--r-- 1 Сэмми Сэмми 1017 18 апреля 14:29 docker-compose.yml -rw-r--r-- 1 Сэмми Сэмми 1013 7 января 2020 г. package.json -rw-r--r-- 1 Сэмми Сэмми 1405 7 января 2020 г. phpunit.xml drwxr-xr-x 2 Сэмми Сэмми 4096 7 января 2020 г. public -rw-r--r-- 1 Сэмми Сэмми 273 7 января 2020 г. 2020 readme.md drwxr-xr-x 6 Сэмми Сэмми 4096 7 января 2020 ресурсы drwxr-xr-x 2 Сэмми Сэмми 4096 7 января 2020 г. маршруты -rw-r--r-- 1 Сэмми Сэмми 563 7 января 2020 г. server.php drwxr -xr-x 5 Sammy Sammy 4096 7 января 2020 г. хранилище drwxr-xr-x 4 Sammy Sammy 4096 7 января 2020 г. тесты -rw-r--r-- 1 Sammy Sammy 538 7 января 2020 г. webpack.mix.js
Теперь мы запустим composer install
, чтобы установить зависимости приложения:
1
<ol><li data-prefix="$"> <span class="token builtin class-name">исполнительное</span> приложение <span class="token function">docker-compose</span><mark> <span class="token function">rm</span> <span class="token parameter variable">-rf</span> поставщик композитора.lock</mark></li><li data-prefix="$"> <span class="token builtin class-name">исполнительное</span> приложение <span class="token function">docker-compose</span><mark> <span class="token function">установка</span> <span class="token function">композитора</span></mark></li></ol>
Вы увидите такой вывод:
1
<div class="secondary-code-label" title="Выход"> Выход</div> Файл композитора.lock отсутствует. Обновление зависимостей до последней версии вместо установки из файла блокировки. См. https://getcomposer.org/install для получения дополнительной информации. . . . Операции с файлами блокировки: 89 установок, 0 обновлений, 0 удалений. v2.3.1) - Блокировка egulias/email-validator (2.1.25) - Блокировка фасада/flare-client-php (1.9.1) - Блокировка фасада/зажигания (1.18.1) - Блокировка фасада/контрактов зажигания (1.0. 2) - Блокировка фиделопера/прокси (4.4.1) - Блокировка фидельопера/прокси (2.14.5) . . . Написание файла блокировки. Установка зависимостей из файла блокировки (включая require-dev). Операции с пакетами: 89 установок, 0 обновлений, 0 удалений. -expression (v2.3.1) - Загрузка symfony/polyfill-php80 (v1.25.0) - Загрузка symfony/polyfill-php72 (v1.25.0) - Загрузка symfony/polyfill-mbstring (v1.25.0) - Загрузка symfony/var-dumper (v4.4.39) - Загрузка symfony/deprecation-contracts (v2.5.1). . . Генерация оптимизированных файлов автозагрузки > IlluminateFoundationComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Обнаруженный пакет: фасад/ignition Обнаруженный пакет: fideloper/proxy Обнаруженный пакет: laravel/tinker Обнаруженный пакет: nesbot/carbon Обнаруженный пакет: nunomaduro/collision Манифест пакета успешно создан.
Последнее, что нам нужно сделать перед тестированием приложения, — это сгенерировать уникальный ключ приложения с помощью инструмента командной строки artisan
Laravel. Этот ключ используется для шифрования пользовательских сеансов и других конфиденциальных данных:
1
<ol><li data-prefix="$"> <span class="token builtin class-name">исполнительное</span> приложение <span class="token function">docker-compose</span><mark> Ключ php artisan: сгенерировать</mark></li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Ключ приложения установлен успешно.
Теперь зайдите в браузер и получите доступ к доменному имени или IP-адресу вашего сервера через порт 8000:
1
http://server_domain_or_IP:8000
Note . Если вы запускаете эту демонстрацию на своем локальном компьютере, используйте http://localhost:8000
для доступа к приложению из браузера.
Вы увидите такую страницу:
Вы можете использовать команду logs
для проверки журналов, созданных вашими сервисами:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> журналы<mark> nginx</mark></li></ol>
1
Attaching to</code> Travellist-nginx . . . список путешествий-nginx | 172.24.9.1 - - [18 апреля 2022 г.:14:49:16 +0000] "GET / HTTP/1.1" 200 627 "-" "curl/7.82.0" travellist-nginx | 172.24.9.1 - - [18/Apr/2022:14:51:27 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox /89.0" Travellist-nginx | 172.24.9.1 - - [18 апреля 2022 г.: 14:51:27 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux) x86_64; rv:89.0) Gecko/20100101 Firefox/89.0"
Если вы хотите приостановить работу среды Docker Compose, сохранив при этом состояние всех ее служб, запустите:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> пауза</li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Приостановка travellist-db ... готово Приостановка travellist-nginx ... готово Приостановка travellist-app ... готово
Затем вы можете возобновить предоставление услуг с помощью:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> снять паузу</li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Снятие с паузы travellist-app ... готово Снятие с паузы travellist-nginx ... готово Снятие с паузы travellist-db ... готово
Чтобы завершить работу среды Docker Compose и удалить все ее контейнеры, сети и тома, выполните:
1
<ol><li data-prefix="$"> <span class="token function">docker-compose</span> вниз</li></ol>
1
<div class="secondary-code-label" title="Выход"> Выход</div> Остановка travellist-nginx ... готово Остановка travellist-db ... готово Остановка travellist-app ... готово Удаление travellist-nginx ... готово Удаление travellist-db ... готово Удаление travellist-app ... готово Удаление сети travellist-laravel-demo_travellist
Обзор всех команд Docker Compose см. в справочнике по командной строке Docker Compose.
Заключение
В этом руководстве мы настроили среду Docker с тремя контейнерами, используя Docker Compose, чтобы определить нашу инфраструктуру в файле YAML.
С этого момента вы можете работать над своим приложением Laravel без необходимости устанавливать и настраивать локальный веб-сервер для разработки и тестирования. Более того, вы будете работать с одноразовой средой, которую можно легко тиражировать и распространять, что может быть полезно при разработке приложения, а также при переходе к производственной среде.