Skip to content

Задание №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:

  1. База данных (database / контейнер db):
    • Образ: mariadb:latest.
    • Порт: 3306:3306.
    • Хранилище: именованный том db_data, смонтированный в каталог /var/lib/mysql. Все таблицы и данные физически хранятся на хосте, поэтому удаление контейнера не приводит к потере данных.
  2. Веб-приложение (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 устанавливаются пакетами:

bash
apt-get update && apt-get install docker-engine docker-compose-v2 -y

Включаем службу в автозапуск и сразу запускаем её:

bash
systemctl enable --now docker.service

Шаг 2. Монтирование диска Additional.iso и просмотр образов ​

Подключаемый диск с дополнительными материалами в Proxmox доступен как блочное устройство привода /dev/sr0:

bash
# Монтируем оптический диск в точку /mnt
mount -o loop /dev/sr0 /mnt/ -v

# Проверяем содержимое каталога docker
ls -l /mnt/docker/

# Читаем сопроводительную инструкцию к образам
cat /mnt/docker/readme.txt

Шаг 3. Загрузка образов в локальное хранилище Docker ​

С помощью команды docker load импортируем образы веб-приложения и СУБД из tar-архивов:

bash
# Загружаем образ веб-сайта
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:

bash
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. Валидация и запуск стека ​

bash
# Проверяем корректность синтаксиса манифеста
docker compose config

# Запускаем стек контейнеров в фоновом режиме (-d / detached)
docker compose up -d

Шаг 2. Проверка запущенных контейнеров и портов ​

bash
# Проверяем статус контейнеров (должны быть в состоянии Up)
docker ps

# Проверяем, что хост слушает порт 8080
ss -ltnp4 | grep 8080

Пример корректного вывода docker ps:

text
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   db

5. Проверка работы веб-приложения и персистентности данных ​

Шаг 1. Проверка доступности с HQ-CLI ​

Переходим на рабочую станцию HQ-CLI, открываем браузер и переходим по прямому IP-адресу сервера:

text
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 принудительно удаляем все запущенные контейнеры:

bash
# Принудительно останавливаем и удаляем все контейнеры
docker rm -f $(docker ps -qa)

# Проверяем список контейнеров (вывод должен быть абсолютно пустым)
docker ps

Проверяем в браузере на HQ-CLI: страница 192.168.3.10:8080 перестала отвечать.

Теперь повторно развёртываем стек из того же манифеста:

bash
docker compose up -d

Обновляем страницу в браузере: сайт снова открывается, а созданная ранее тестовая запись сохранилась в полном объеме! Это подтверждает правильную работу именованного тома db_data.

Итог выполнения Задания №6

Контейнеризированный стек успешно развернут через Docker Compose, сервисы tespapp и db запущены и взаимодействуют по внутренней сети, а данные СУБД надёжно защищены от потери при перезапуске.

Работает на VitePress • Быстрый и удобный движок для документации