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

Зміст:
Ефективне розгортання та масштабування сучасних веб-додатків важко уявити без використання контейнерного середовища, однією з реалізацій котрого є Docker Compose. Сервіс дозволяє здійснювати швидке упакування додатків та їх залежностей у кросплатформні контейнери, які потім легко можна розгорнути на будь-якій платформі незалежно одне від одного. Розглянемо процес створення та запуску у середовищі Docker Compose багатоконтейнерного PHP-додатку із СУБД MySQL на VPS-сервері під управлінням ОС Debian Bookworm.
Формування контейнерного середовища
Перед початком роботи над створенням веб-проекту, необхідно підготувати відповідне Docker-середовище. Використання Docker Compose можливе лише за наявності Docker Engine і тому з’ясуємо його поточний статус на нашому VPS-сервері.
Це можна зробити за допомогою команди info, котра надасть нам повну інформацію про сервіс:
$ docker info


Вихід:
Client: Docker Engine – Community Version: 28.0.1
Це означає, що сервіс Docker Engine вже розгорнутий на нашому сервері. Його версія – 28.0.1.
У випадку, якщо сервіс відсутній, його слід встановити, керуючись інструкцією, наведеною нами раніше в статті для VPS-серверу Ubuntu. Лише необхідно у відповідних командах замінити тип та версію ОС на реально встановлену на вашому сервері. У нашому випадку – на Debian Bookworm Stable.
Перевіримо наявність Compose:
$ docker-compose --version

Вихід:
-bash: docker-compose: command not found
Як бачимо, сервіс відсутній і тому переходимо до процесу його встановлення. Введемо в терміналі:
$ apt install docker-compose

Підтверджуємо свою згоду на виділення додаткових 46,8 МВ дискового простору та «йдемо далі». Нижче виведений кінцевий екран команди.

Вихід: Setting up docker-compose
Перевіримо версію програми:
$ docker-compose --version

Вихід:
docker-compose version 1.29.2, build unknown
Отже, середовище підготовлене, можна розпочинати роботу над формуванням структури проекту.
Створення веб-проекту
Структура веб-проекту, визначається набором служб із описом правил їх взаємодії між собою, котрі у вигляді директив присутні у файлі docker-compose.yml. Отже, він є головним файлом проекту у середовищі Docker Compose і тому повинен знаходитися у його кореневій директорії.
Обов’язковим елементом додатку є файл із ім’ям Dockerfile. Він містить інструкції для формування або збірки Docker-шаблонів додатку із необхідними залежностями та подальшого їх запуску у контейнерному середовищі. Він завжди знаходиться у корні визначеного веб-додатку.
Складовою частиною будь-якого веб-додатку є його індексний файл, котрий містить основний код та визначає його роботу. Знаходиться файл у кореневій директорії додатку.
Нижче наведена структура нашого проекту, котра включає всі описані нами елементи.

Тут директорія newproject_php є головним каталогом проекту, а директорія one-app – головним каталогом веб-додатку.
Реалізуємо вказаний проект у підготовленому нами контейнерному середовищі. Для цього розіб’ємо процес на кілька етапів:
-
Формування структури каталогів;
-
Створення конфігураційного файлу проекту docker-compose.yml;
-
Створення конфігураційного файлу веб-додатку Dockerfile;
-
Підготовка та розміщення індексного файлу веб-додатку.
Формування структури каталогів
Створимо необхідні каталоги за допомогою лише однієї команди. Для цього введемо в терміналі:
$ mkdir -p newproject_php/one-app

Структура готова.
Створення конфігураційного файлу docker-compose.yml
Нижче наведені директиви майбутнього файлу разом з їх описом у вигляді коментарів.
version: '3.8' services: one-app: build: ./one-app # Створення Docker-образу додатку з вказаної директорії ports: - "8080:80" # Узгоджуються порти хоста та контейнера depends_on: - mysql # Забезпечується виконання залежностей – запуск СУБД mysql: image: mysql:8.0 # Вказується на використання офіційного образу СУБД ports: - "3306:3306" # Узгодження портів хоста та контейнера environment: MYSQL_ROOT_PASSWORD: root # Пароль кореневого користувача для MySQL MYSQL_DATABASE: mydb # Ініціювання створення СУБД volumes: - mysql-data:/var/lib/mysql # Збереження даних СУБД в іменованому томі volumes: mysql-data: # Декларування імені тому для зберігання даних СУБД
Помістимо наведений код у новий файл та збережемо його на диску. Для цього скористаємося редактором nano:
$ nano newproject_php/docker-compose.yml

Збережемо внесені зміни та вийдемо з редактору (ctrl+X).
Перейдемо до наступного етапу.
Створення конфігураційного файлу Dockerfile
Наведемо код майбутнього файлу разом із коментарями:
# Вказівка на використання офіційного образу PHP FROM php:8.2-apache # Встановлення плагіну PDO для MySQL RUN docker-php-ext-install pdo pdo_mysql # Встановлення робочої директорії WORKDIR /var/www/html # Копіювання коду додатку COPY index.php . # Відкриття порту контейнеру EXPOSE 80
Викличемо редактор та вставимо наведений код у конфігураційний файл:
$ nano newproject_php/one-app/Dockerfile

Збережемо внесені зміни та вийдемо з редактору.
Підготовка та розміщення індексного файлу веб-додатку
У нашому випадку код файлу буде визначати процес створення нового з’єднання та підключення до контейнеру СУБДMySQL. Його код наведений нижче.
<?php
$servername = "mysql"; // Ім’я визначається у файлі docker-compose.yml
$username = "root";
$password = "root";
$database = "mydb";
try {
// Створення нового з’єднання
$conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
// Встановлення режиму PDO помилок на виключення
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected to MySQL successfully!";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>
Вставимо код у індексний файл за допомогою наступної команди:
$ nano newproject_php/one-app/index.php

Тестування та запуск веб-проекту
Для можливості тестування та запуску проекту необхідно виконати збірку контейнерів, як визначено у конфігураційному файлі Dockerfile. Для цього скористаємося відповідною командою сервісу Docker Compose.
Перейдемо до каталогу проекту. Для цього введемо в терміналі:
$ cd newproject_php

Запустимо процес збірки проекту:
$ docker-compose up --build

Програма розбила процес на кілька етапів у відповідності до наявних інструкцій у файлах конфігурації.
Створення внутрішньої мережі під назвою newproject_php_default, котра призначена для об'єднання всіх контейнерів між собою.
Створення тому під назвою newproject_php_mysql-data для зберігання даних.
Завантаження базових шаблонів для mysql:8.0 та php:8.2-apache.
Результати виконання вказаних операцій виведені у попередньому вікні терміналу.
Розгортання плагіну PDO для MySQL (Step 2/5 : RUN docker-php-ext-install pdo pdo_mysql), хід якого показаний на скриншотах нижче.


Результат: Build complete
Ініціалізація робочої директорії додатку (Step 3/5 : WORKDIR /var/www/html).

Копіювання коду додатку (Step 4/5 : COPY index.php . )

Відкриття порту 80 контейнеру (Step 5/5 : EXPOSE 80).

Програма вивела результати успішного завершення процесу збірки та розгортання проекту:
Successfully tagged newproject_php_one-app:latest Creating newproject_php_mysql_1 ... done Creating newproject_php_one-app_1 ... done Attaching to newproject_php_mysql_1, newproject_php_one-app_1
Щоб переконатися, що під’єднання відбулося і додаток працює необхідно ввести в адресну строчку браузера його адресу у наступному форматі:
http://178.20.159.96:8080/
Тут 178.20.159.96 – IP-адреса нашого серверу.
Результат показаний нижче.
Це саме те повідомлення (Connected to MySQL successfully!), котре ми ввели у коді індексного файлу для випадку успішного під'єднання до mysql. Отже, все гаразд – проект робочий.
Запрошуємо Вас скористатися нашим VPS хостингом з Docker. Дата-центр FREEhost.UA надає надійні сервери з підтримкою 24/7 та щоденними бекапами. Вже через кілька хвилин після підтвердження замовлення Ви зможете почати працювати з повністю налаштованим сервером.
Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
|
Дата: 14.03.2025 Автор: Олекксандр Ровник
|
|

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus