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

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

Узнайте, как настроить и запустить PHP в Docker Compose на Debian Bookworm. Пошаговое создание контейнеров, MySQL, тестирование

Содержание:

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

Формирование контейнерной среды

Перед началом работы над созданием веб-проекта необходимо подготовить соответствующее 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 MB дискового пространства и «идем дальше». Ниже выведен конечный экран команды

python3-docop

Выход:

Setting up docker-compose 

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

$ docker-compose --version

$ docker-compose --version

Выход: docker-compose version 1.29.2, build unknown

Создание веб-проекта

Структура веб-проекта определяется набором служб с описанием правил их взаимодействия между собой, которые посредством директив присутствуют в файле docker-compose.ymll. Следовательно, он является главным файлом проекта в среде 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

Инициализация рабочей директории приложения (Шаг 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-адрес нашего сервера
pre>

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

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