Статья также доступна на украинском (перейти к просмотру).

Оглавление
Процесс создания современного PHP-приложения сейчас невозможно представить без использования контейнерной среды, значительно повышающей эффективность разработки по сравнению с обычными условиями. Инструмент Docker, который рассматривался в одной из предыдущих статей, способен обеспечить существование среды, в которой в автоматическом режиме будет осуществляться оркестрирование контейнеров приложения, количество которых почти не ограничено. Рассмотрим последовательность действий по развертыванию среды и созданию контейнеров для компонентов приложения.
Предпосылки
В нашем распоряжении есть VPS-сервер под управлением Ubuntu 22.04, на котором и будут производиться все необходимые настройки.
Базовый инструмент Docker Engine способен обеспечить работу только одного контейнера, что недостаточно для создания полноценной среды. С помощью плагина Compose можно решить этот вопрос, поскольку именно он способен обеспечить управление и взаимодействие между разными контейнерами в пределах рабочей среды. Следовательно, этот плагин необходимо будет установить.
Конфигурирование среды Docker Compose обычно производится с помощью файла docker-compose.yml, как мы это продемонстрировали раньше в нашей статьи. Для этого мы используем его в своем проекте.
Конфигурация проекта будет состоять из набора служб или контейнеров, содержащих следующие компоненты приложения – PHP, веб-сервер Nginx и база данных Mysql. В проекте будет использована одна из веток Mysql – MariaDB, которая полностью с ней совместима и имеет лучшие характеристики.
На этапе развертывания проекта будет осуществляться контроль состояния на основе анализа состояния каждого из компонентов приложения.
Подготовка среды Docker Compose
Для начала, проверим состояние сервиса Docker Engine на нашем сервере. Для этого введем в терминале:
$ docker info


На выходе получили следующий результат: Client: Docker Engine – Community, Version:25.0.3, что говорит о наличии установленного сервиса.
Установим плагин Compose:
$ apt install docker-compose



Результат: Setting up docker-compose ..., то есть плагин успешно установлен.
Проверить версию плагина можно с помощью следующей команды:
$ docker-compose --version

Версия – docker-compose version 1.29.2.
Создание проекта Compose
Подготовка контейнерной среды разработки веб-приложения отождествляется с созданием проекта Compose. Для этого начинать нужно с создания каталога проекта Compose.Его имя – new_compose_project. Создадим каталог, после чего перейдем к нему.
Введем в терминале:
$ mkdir new_compose_project $ cd new_compose_project

В этом же каталоге будет размещаться файл docker-compose.yml, в который мы постепенно будем вносить новые данные по мере добавления очередного компонента.
Создание Nginx-контейнера и его настройки
Для запуска и настройки контейнера откроем файл docker-compose.yml и внесем в него следующие изменения:
$ nano docker-compose.yml
version: "3.9"
services:
nginx:
image: nginx:latest
container_name: web-container
ports:
- 80:80
Здесь мы указали первоначальный образ, из которого будет разворачиваться веб-сервер, имя контейнера и порт, на котором он будет работать.

Сохраним внесенные изменения и выйдем из редактора.
Запустим Docker Compose, который в автоматическом режиме создаст конфигурацию среды в соответствии с инструкциями файла docker-compose.yml. Для этого введем в терминале:
$ docker-compose up -d

Выход команды:
Creating network "new_compose_project_default" with the default driver Pulling nginx (nginx:latest)... .................. Status: Downloaded newer image for nginx:latest Creating web-container ... done
В результате была создана разветвленная сеть проекта со стандартным драйвером и запущен контейнер для веб-сервера Nginx.
Убедиться в том, что контейнер запущен можно с помощью следующей команды:
$ docker ps

Выход:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3cbacd13273a nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp web-container
Можно убедиться, что контейнер с именем web-container создан и запущен, то есть активен. Указан порт, на котором он работает, его ID (3cbacd13273a) и имя.
Просмотр результатов запущенного компонента можно в веб-режиме. Для этого наберем в адресной строчке браузеру:
http://178.20.159.96:80/
Здесь 178.20.159.96 – IP-адрес нашего сервера, 80 – порт, на котором работает Nginx.
Ниже показан результат работы веб-сервера. Это поздравительная страница веб-сервера Nginx.

Создадим каталог для веб-сервера:
$ mkdir web

Создадим файл конфигурации веб-сервера, необходимый для запуска веб-приложения:
$ nano web/default.conf
Внесем в него следующий код:
server {
listen 80 default_server;
root /var/www/html;
index index.html index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /var/log/nginx/error.log error;
sendfile off;
client_max_body_size 100m;
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_read_timeout 300;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
location ~ /.ht {
Alter;
}
}

Сохраним внесенные изменения и выйдем из редактора.
Давайте создадим Dockerfile, чтобы можно было скопировать созданный ранее файлdefault.conf:
$ nano web/Dockerfile
Вставим следующий код:
FROM nginx COPY ./default.conf /etc/nginx/conf.d/default.conf

Сохраним изменения и закроем файл.
Создание PHP-контейнера приложения
Этот контейнер будет содержать код нашего веб-проекта.
В корневом каталоге проекта создадим каталог для PHP-кода:
$ mkdir php

В созданный каталог с именем php можно скопировать или клонировать PHP-код нашего веб-проекта из любого источника, например, из github-репозитория:
git clone https://github.com/compose-private-limited/php-project.git ~/new_compose_project/php/
Давайте создадим Dockerfile для контейнера:
$ nano php/Dockerfile
Внесем в него следующий код:
FROM php:7.0-fpm RUN docker-php-ext-install mysqli pdo pdo_mysql RUN docker-php-ext-enable mysqli

Давайте обновим YML-файл с учетом появления нового PHP-компонент:
$ nano docker-compose.yml
Обновленный код:
version: "3.9"
services:
nginx:
build: ./web/
ports:
- 80:80
volumes:
- ./php/:/var/www/html/
php:
build: ./php/
expose:
- 9000
volumes:
- ./php/:/var/www/html/

Сохраним изменения и выйдем из редактора.
Введем команду запуска контейнеров в фоновом режиме:
$ docker-compose up -d


Убедимся, что PHP-контейнер активен. Введем в терминале:
$ docker ps

Виход:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 886985e06db7 new_compose_project_php "docker-php-entrypoi…" 5 minutes ago Up 5 minutes 9000/tcp new_compose_project_php_1
Можно убедиться, что контейнер с именем new_compose_project_php_1 запущен. Его ID - 886985e06db7.
Для того, чтобы увидеть результаты работы php-приложения в веб-режиме, достаточно в браузере перейти по ссылке:
http://ip-сервера
Создание контейнера базы данных MariaDB
Нам осталось создать MariaDB-компонент в качестве отдельного контейнера и настроить его для работы с нашим приложением.
Обновим YAML файл проекта:
$ nano docker-compose.yml
Добавим к нему следующий код:
db:
image: mariadb
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mariadb
MYSQL_DATABASE: mybase
volumes:
mysql-data:
Здесь мы указали первоначальный образ для развертывания базы, каталог размещения программы, пароль доступа для root-пользователя, название базы данных. Весь код файла отображается в окне редактора.

Сохраним изменения и выйдем из редактора.
Запустим контейнер:
$ docker-compose up -d

Виход:
Creating volume "new_compose_project_mysql-data" with default driver Pulling db (mariadb:)... ............ Status: Downloaded newer image for mariadb:latest new_compose_project_php_1 is up-to-date Starting new_compose_project_nginx_1 ... done Creating new_compose_project_db_1 ... done
Можно убедиться, что контейнер с именем new_compose_project_db_1 создан.
Убедимся, что он активен:
$ docker ps

Результат:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b79fc6879274 mariadb "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 3306/tcp new_compose_project_db_1 886985e06db7 new_compose_project_php "docker-php-entrypoi…" 4 hours ago Up 4 hours 9000/tcp new_compose_project_php_1
Контейнер запущен. Его ID - b79fc6879274.
Выполним серию настроек для нашей базы.
Для этого создадим CLI внутри контейнера, используя его ID:
$ docker exec -it b79fc6879274 /bin/sh

Установим root-доступ к базе:
# mariadb -u root -pmariadb

Создадим пользователя базы:
MariaDB > CREATE USER 'dbuser'@'%' IDENTIFIED BY "dbuser333";

Расширим для него права:
MariaDB > GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;

Выйдем из оболочки MariaDB:
MariaDB > exit

Приведем код создания таблицы и загрузку записей с данными в базу:
# cat > db_script.sql <<-EOF
USE mybase;
CREATE TABLE food (id mediumint(8) unsigned NOT NULL auto_increment,Nameone varchar(255) default NULL,Pricenew varchar(255) default NULL, Url varchar(255) default NULL,PRIMARY KEY (id)) AUTO_INCREMENT=1;
INSERT INTO food (Nameone,Pricenew,Url) VALUES ("Apple","100","c31.png"),("Lemon","200","c32.png"),("Orange","300","c33.png"),("Mandarin","50","c35.png"),("Banana ","90","c36.png"),("Kiwi","20","c37.png"),("Cucumber","80","c38.png"),("Pepper","150","c34.png");
EOF

Запустим сценарий:
# mariadb -u root -pmariadb < db_script.sql

Выйдем из оболочки контейнера:
# exit

Компонент сконфигурирован и готов к работе.
Для того чтобы во время работы приложения данные корректно выбирались из базы, в PHP-коде необходимо наличие кода, который приведен ниже:
<?php
$link = mysqli_connect('db', 'dbuser', 'dbuser333', 'mybase');
if ($link) {
$res = mysqli_query($link, "select * from food;");
while ($row = mysqli_fetch_assoc($res)) { ?>
Просмотр окончательных результатов работы веб-приложения можно по ссылке:
http://ip-сервера или http://localhost
Дата-центр FREEhost.UA предлагает VPS сервер с Docker. Кроме базового программного обеспечения, сборка влючает визуальный инструмент управления контейнерами — Portainer. С его помощью Вы сможете управлять контейнерами, имиджами и многим другим. Уже через несколько минут после подтверждения заказа, полностью настроенный сервер готов к работе.
Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем ошиблись, или что-то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.
|
Дата: 27.03.2024 Автор: Александр Ровник
|
|

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus