• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Дізнайтеся, як настроїти та запустити PHP у Docker Compose на Debian Bookworm. Покрокове створення контейнерів, MySQL, тестування

Зміст:

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

Формування контейнерного середовища

Перед початком роботи над створенням веб-проекту, необхідно підготувати відповідне Docker-середовище. Використання Docker Compose можливе лише за наявності Docker Engine і тому з’ясуємо його поточний статус на нашому VPS-сервері.

Це можна зробити за допомогою команди info, котра надасть нам повну інформацію про сервіс:

$ docker info

$ docker info

kernel version: 6.1.0-28

Вихід:

Client: Docker Engine – Community Version:  28.0.1

Це означає, що сервіс Docker Engine вже розгорнутий на нашому сервері. Його версія – 28.0.1.

У випадку, якщо сервіс відсутній, його слід встановити, керуючись інструкцією, наведеною нами раніше в статті для VPS-серверу Ubuntu. Лише необхідно у відповідних командах замінити тип та версію ОС на реально встановлену на вашому сервері. У нашому випадку – на Debian Bookworm Stable. 

Перевіримо наявність Compose:

$ docker-compose --version

$ docker-compose --version

Вихід:

-bash: docker-compose: command not found

Як бачимо, сервіс відсутній і тому переходимо до процесу його встановлення. Введемо в терміналі: 

$ apt  install docker-compose

$ apt  install docker-compose

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

python3-docop

Вихід: Setting up docker-compose 

Перевіримо версію програми:

$ docker-compose --version 

$ docker-compose --version

Вихід:

docker-compose version 1.29.2, build unknown 

Отже, середовище підготовлене, можна розпочинати роботу над формуванням структури проекту.

Створення веб-проекту

Структура веб-проекту, визначається  набором служб із описом правил їх взаємодії між собою, котрі у вигляді директив присутні у файлі docker-compose.yml. Отже, він є головним файлом проекту у середовищі Docker Compose і тому повинен знаходитися у його кореневій директорії.

Обов’язковим елементом додатку є файл із ім’ям Dockerfile. Він містить інструкції для формування або збірки Docker-шаблонів додатку із необхідними залежностями та подальшого їх запуску у контейнерному середовищі. Він завжди знаходиться у корні визначеного веб-додатку.

Складовою частиною будь-якого веб-додатку є його індексний файл, котрий містить основний код та визначає його роботу. Знаходиться файл у кореневій директорії додатку.

Нижче наведена структура нашого проекту, котра включає всі описані нами елементи.

newproject_php

Тут директорія newproject_php є головним каталогом проекту, а директорія one-app – головним каталогом веб-додатку.

Реалізуємо вказаний проект у підготовленому нами контейнерному середовищі. Для цього розіб’ємо процес на кілька етапів:

  • Формування структури каталогів;

  • Створення конфігураційного файлу проекту docker-compose.yml;

  • Створення конфігураційного файлу веб-додатку Dockerfile;

  • Підготовка та розміщення індексного файлу веб-додатку.

Формування структури каталогів

Створимо необхідні каталоги за допомогою лише однієї команди. Для цього введемо в терміналі:

$ mkdir -p newproject_php/one-app

$ 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

$ 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

$ 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

$ nano newproject_php/one-app/index.php

Тестування та запуск веб-проекту

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

Перейдемо до каталогу проекту. Для цього введемо в терміналі:

$ cd newproject_php

$ cd новыйproject_php

Запустимо процес збірки проекту:

$ docker-compose up --build

$ 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), хід якого показаний на скриншотах нижче.

step 2/5

bulid complete

Результат: Build complete

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

step 3/5

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

Step 4/5 : COPY index.php

Відкриття порту 80 контейнеру (Step 5/5 : EXPOSE 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-адреса нашого серверу.

Результат показаний нижче.

http://178.20.159.96:8080 

Це саме те повідомлення (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
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA