Каварналы Анастасия, IA2403
Дата: 08.04.2026
Ознакомиться с работой многоконтейнерного приложения на базе docker-compose
Создать php приложение на базе трех контейнеров: nginx, php-fpm, mariadb, используя docker-compose
Для выполнения данной работы необходимо иметь установленный на компьютере Docker
- Для подтверждения корректной установки и работы Docker выполнена команда
docker --version
docker psРабота выполняется на базе лабораторной работы №6
В качестве основы использовался репозиторий containers07
В корне проекта была создана директория mounts/site, в которую необходимо поместить PHP-сайт, разработанный ранее в рамках проекта по php
<?php
$day = date('N');
if ($day == 1 || $day == 3 || $day == 5) {
$johnSchedule = "8:00 - 12:00";
} else {
$johnSchedule = "Нерабочий день";
}
if ($day == 2 || $day == 4 || $day == 6) {
$janeSchedule = "12:00 - 16:00";
} else {
$janeSchedule = "Нерабочий день";
}
?>
<style>
table {
border-collapse: collapse;
}
th, td {
padding: 6px 10px;
text-align: left;
}
</style>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>№</th>
<th>Фамилия Имя</th>
<th>График работы</th>
</tr>
<tr>
<td>1</td>
<td>John Styles</td>
<td><?= $johnSchedule ?></td>
</tr>
<tr>
<td>2</td>
<td>Jane Doe</td>
<td><?= $janeSchedule ?></td>
</tr>
</table>
<?php
echo "<br><br>";
$a = 0;
$b = 0;
for ($i = 0; $i <= 5; $i++) {
$a += 10;
$b += 5;
echo "Шаг $i: a = $a, b = $b <br>";
}
echo "Конец for-цикла! <br><br>";
$a = 0;
$b = 0;
$i = 0;
while ($i <= 5) {
$a += 10;
$b += 5;
echo "Шаг $i: a = $a, b = $b <br>";
$i++;
}
echo "Конец while-цикла! <br><br>";
$a = 0;
$b = 0;
$i = 0;
do {
$a += 10;
$b += 5;
echo "Шаг $i: a = $a, b = $b <br>";
$i++;
} while ($i <= 5);
echo "Конец do_while-цикла! <br><br>";
?>В корне проекта создан файл .gitignore со следующим содержимым:
# Ignore files and directories
mounts/site/*Данный файл исключает содержимое каталога mounts/site из системы контроля версий
В директории nginx создан файл default.conf:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass backend:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}В данной конфигурации:
- принимает
HTTP-запросына80 порту; - корневой каталог сайта внутри контейнера:
/var/www/html; - все PHP-файлы передаются на обработку в контейнер
backend; - связь между контейнерами выполняется по внутренней сети
docker-compose; - если файл не найден, перенаправляет запрос в
index.php
В корне проекта создан файл docker-compose.yml:
version: '3.9'
services:
frontend:
image: nginx:1.19
volumes:
- ./mounts/site:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
networks:
- internal
backend:
image: php:7.4-fpm
volumes:
- ./mounts/site:/var/www/html
networks:
- internal
env_file:
- mysql.env
database:
image: mysql:8.0
env_file:
- mysql.env
networks:
- internal
volumes:
- db_data:/var/lib/mysql
networks:
internal: {}
volumes:
db_data: {}В проекте описаны три сервиса:
frontend- контейнер на базеnginx:1.19;backend- контейнер на базеphp:7.4-fpm;database- контейнер на базеmysql:8.0
Также:
- сайт монтируется в
/var/www/html; - база использует том
db_data; - все сервисы подключены к сети
internal
В корне проекта создан файл mysql.env:
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=app
MYSQL_USER=user
MYSQL_PASSWORD=secretЭтот файл используется для передачи параметров подключения к базе данных в контейнер базы данных и PHP-контейнер
Для запуска приложения использовалась команда:
docker-compose up -dВ результате выполнения команды docker-compose up -d Docker Compose обработал файл docker-compose.yml и запустил контейнеры проекта в фоновом режиме. В консоли отображается предупреждение о том, что параметр version является устаревшим, а также сообщение No services to build, которое означает, что сборка образов не требовалась. После этого были успешно запущены контейнеры containers07-database-1, containers07-backend-1 и containers07-frontend-1, все со статусом Running
После запуска контейнеров сайт проверяется в браузере по адресу:
http://localhost
Приложение успешно отобразило PHP-страницу с таблицей сотрудников, их графиком работы и результатами выполнения циклов for, while и do-while
1. В каком порядке запускаются контейнеры?
При запуске проекта Docker Compose сначала создает общие ресурсы, например сеть и том для базы данных, а затем запускает контейнеры. Поскольку в файле docker-compose.yml не указан параметр depends_on, строгий порядок запуска сервисов frontend, backend и database явно не задается
2. Где хранятся данные базы данных?
Данные базы не хранятся только внутри контейнера. Для этого в проекте используется отдельный Docker volume db_data. Он подключается к контейнеру базы данных в директорию /var/lib/mysql. За счет этого информация сохраняется даже после остановки или пересоздания контейнера
3. Как называются контейнеры проекта?
Контейнеры проекта получают имена по шаблону имя_проекта-имя_сервиса-номер. В данном случае это могут быть containers07-frontend-1, containers07-backend-1 и containers07-database-1
4. Вам необходимо добавить еще один файл app.env с переменной окружения APP_VERSION для сервисов backend и frontend. Как это сделать?
Для этого нужно в корне проекта создать новый файл app.env и записать в него переменную, например APP_VERSION=1.0.0. Затем этот файл надо подключить в docker-compose.yml для сервисов frontend и backend через параметр env_file. После этого оба контейнера смогут использовать переменную APP_VERSION при запуске
В ходе выполнения лабораторной работы было создано многоконтейнерное приложение с использованием Docker Compose. В процессе работы была настроена совместная работа веб-сервера Nginx, обработчика PHP через php-fpm и базы данных. Также была изучена структура файла docker-compose.yml, принцип подключения томов, сети и переменных окружения. В результате проект был успешно запущен в контейнерах, а сайт стал доступен через браузер.


