Задание №6: Веб-приложение в Docker на сервере BR-SRV
В данном задании на сервере филиала (BR-SRV) с помощью Docker и Docker Compose v2 развёртывается двухзвенный стек контейнеров, состоящий из веб-приложения и реляционной СУБД MariaDB.
Образы контейнеров импортируются из архивов tar с подключаемого виртуального компакт-диска Additional.iso. База данных настраивается с сохранением данных в именованный том (Docker Volume), обеспечивая персистентность записей при перезапуске или пересоздании контейнеров.
Место выполнения
- Основные действия выполняются под пользователем
rootна сервере BR-SRV (br-srv.au-team.irpo). - Проверка веб-интерфейса выполняется с рабочей станции HQ-CLI.
1. Теоретическая справка: Docker и Docker Compose
Архитектура решения
Стек состоит из двух изолированных сервисов, объединенных внутренней виртуальной сетью Docker:
- База данных (
database/ контейнерdb):- Образ:
mariadb:latest. - Порт:
3306:3306. - Хранилище: именованный том
db_data, смонтированный в каталог/var/lib/mysql. Все таблицы и данные физически хранятся на хосте, поэтому удаление контейнера не приводит к потере данных.
- Образ:
- Веб-приложение (
app/ контейнерtespapp):- Образ:
site:latest. - Внутренний порт приложения:
8000. - Внешний порт публикации на хосте:
8080(8080:8000). - Директива
depends_on: databaseгарантирует, что контейнер приложения будет запущен только после старта базы данных.
- Образ:
Обратите внимание на имя контейнера
В формулировке конкурсного задания указано требование: «Основной контейнер testapp должен называться tespapp» (с опечаткой). В файле docker-compose.yml директива container_name: tespapp строго соблюдает это условие.
2. Установка Docker и импорт образов на BR-SRV
Выполняем все команды под пользователем root на сервере BR-SRV:
Шаг 1. Установка пакетов Docker и Docker Compose
В дистрибутиве ALT Linux демон Docker и современный плагин Compose устанавливаются пакетами:
apt-get update && apt-get install docker-engine docker-compose-v2 -yВключаем службу в автозапуск и сразу запускаем её:
systemctl enable --now docker.serviceШаг 2. Монтирование диска Additional.iso и просмотр образов
Подключаемый диск с дополнительными материалами в Proxmox доступен как блочное устройство привода /dev/sr0:
# Монтируем оптический диск в точку /mnt
mount -o loop /dev/sr0 /mnt/ -v
# Проверяем содержимое каталога docker
ls -l /mnt/docker/
# Читаем сопроводительную инструкцию к образам
cat /mnt/docker/readme.txtШаг 3. Загрузка образов в локальное хранилище Docker
С помощью команды docker load импортируем образы веб-приложения и СУБД из tar-архивов:
# Загружаем образ веб-сайта
docker load < /mnt/docker/site_latest.tar
# Загружаем образ СУБД MariaDB
docker load < /mnt/docker/mariadb_latest.tar
# Проверяем список загруженных образов
docker image lsВ выводе должны появиться образы site:latest и mariadb:latest.
3. Создание манифеста docker-compose.yml
В рабочей директории создаём файл манифеста docker-compose.yml:
cat << 'EOF' > docker-compose.yml
services:
database:
container_name: db
image: mariadb:latest
restart: always
ports:
- "3306:3306"
environment:
MARIADB_DATABASE: testdb
MARIADB_USER: testc
MARIADB_PASSWORD: P@ssw0rd
MARIADB_ROOT_PASSWORD: P@ssw0rd
volumes:
- db_data:/var/lib/mysql
app:
container_name: tespapp
image: site:latest
restart: always
ports:
- "8080:8000"
environment:
DB_HOST: database
DB_PORT: 3306
DB_NAME: testdb
DB_USER: testc
DB_PASS: P@ssw0rd
DB_TYPE: maria
depends_on:
- database
volumes:
db_data:
EOFРазбор ключевых переменных окружения (environment):
MARIADB_DATABASE: testdb— СУБД автоматически создаёт базу данных с именемtestdbпри первой инициализации.MARIADB_USER: testc/MARIADB_PASSWORD: P@ssw0rd— создаётся учётная запись пользователя с правами на созданную БД.DB_HOST: database— приложение подключается к СУБД по имени службы (database), которое резолвится внутренним DNS-сервером Docker.
4. Запуск и верификация контейнеров
Шаг 1. Валидация и запуск стека
# Проверяем корректность синтаксиса манифеста
docker compose config
# Запускаем стек контейнеров в фоновом режиме (-d / detached)
docker compose up -dШаг 2. Проверка запущенных контейнеров и портов
# Проверяем статус контейнеров (должны быть в состоянии Up)
docker ps
# Проверяем, что хост слушает порт 8080
ss -ltnp4 | grep 8080Пример корректного вывода docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a2b3c4d5e6f site:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8000/tcp, :::8080->8000/tcp tespapp
7g8h9i0j1k2l mariadb:latest "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp db5. Проверка работы веб-приложения и персистентности данных
Шаг 1. Проверка доступности с HQ-CLI
Переходим на рабочую станцию HQ-CLI, открываем браузер и переходим по прямому IP-адресу сервера:
http://192.168.3.10:8080Важное пояснение про доменное имя docker.au-team.irpo
По тексту задания обращение должно производиться по доменному имени docker.au-team.irpo. Однако на данном этапе обратный прокси-сервер (Nginx Reverse Proxy) на маршрутизаторе ISP и проброс портов на BR-RTR ещё не настроены — они настраиваются далее в Заданиях №8 и №9. На текущем шаге работоспособность проверяется прямым обращением по IP-адресу 192.168.3.10:8080 из внутренней сети!
Шаг 2. Тестирование сохранности данных (Docker Volume)
В веб-интерфейсе приложения создаём тестовую запись (заметку, пост или объект).
Затем на сервере BR-SRV принудительно удаляем все запущенные контейнеры:
# Принудительно останавливаем и удаляем все контейнеры
docker rm -f $(docker ps -qa)
# Проверяем список контейнеров (вывод должен быть абсолютно пустым)
docker psПроверяем в браузере на HQ-CLI: страница 192.168.3.10:8080 перестала отвечать.
Теперь повторно развёртываем стек из того же манифеста:
docker compose up -dОбновляем страницу в браузере: сайт снова открывается, а созданная ранее тестовая запись сохранилась в полном объеме! Это подтверждает правильную работу именованного тома db_data.
Итог выполнения Задания №6
Контейнеризированный стек успешно развернут через Docker Compose, сервисы tespapp и db запущены и взаимодействуют по внутренней сети, а данные СУБД надёжно защищены от потери при перезапуске.
