Skip to content

Лабораторная работа №3: Управление данными (Volumes)

Научиться использовать volumes (тома) для сохранения данных stateful-приложений (таких как базы данных) и обеспечить их персистентность (сохранность) независимо от жизненного цикла контейнера.

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Stateless vs Stateful приложения

Section titled “1. Stateless vs Stateful приложения”
  • Stateless (без состояния): Приложения, которые не хранят никаких данных между запросами. Веб-сервер, который отдает статические файлы — классический пример. Такие контейнеры можно безболезненно удалять и создавать заново.
  • Stateful (с состоянием): Приложения, которые хранят данные, изменяющиеся со временем. Любая база данных — это stateful-приложение. Если удалить такой контейнер, все накопленные данные будут потеряны.

2. Файловая система контейнера

Section titled “2. Файловая система контейнера”

Каждый контейнер имеет свою собственную изолированную файловую систему. Когда контейнер удаляется (docker rm), его файловая система уничтожается вместе со всеми данными, которые были в ней созданы.

Volumes — это предпочтительный механизм для сохранения данных, генерируемых и используемых Docker-контейнерами.

  • Тома полностью управляются Docker (docker volume create, docker volume ls).
  • Они хранятся в специальной директории на хост-машине (например, /var/lib/docker/volumes/), но пользователю не следует напрямую изменять файлы в ней.
  • Том можно одновременно подключить к нескольким контейнерам.
  • Тома не удаляются автоматически при удалении контейнера, что и обеспечивает сохранность данных.
  • Рекомендуемая литература: Manage data in Docker (Документация Docker)

Альтернативный механизм, который “пробрасывает” файл или директорию с хост-машины в контейнер. В отличие от volumes, bind mounts полностью зависят от структуры файловой системы хоста. Они полезны для разработки, когда нужно “вживую” редактировать код на хосте и видеть изменения в контейнере.

Задания для выполнения

Section titled “Задания для выполнения”
  1. Создание и использование Volume:

    • На Db-node убедитесь, что нет запущенных или остановленных контейнеров (docker ps -a).
    • Создайте именованный volume командой:
      Terminal window
      docker volume create mysql-data
    • Просмотрите список существующих томов: docker volume ls.
    • Запустите контейнер mysql заново, но на этот раз добавьте флаг -v для монтирования тома:
      Terminal window
      docker run -d --name db-mysql \
      -e MYSQL_ROOT_PASSWORD=mysecretpassword \
      -v mysql-data:/var/lib/mysql \
      mysql:8.0
      • -v mysql-data:/var/lib/mysql: эта опция говорит Docker “взять том с именем mysql-data и примонтировать его в контейнер по пути /var/lib/mysql”. Именно в этой директории MySQL хранит все свои файлы данных.
  2. Проверка сохранности данных:

    • На Web-node запустите контейнер ghost (как в прошлой работе).
    • Откройте в браузере http://<ip-Web-node>:8080/ghost, пройдите первоначальную настройку (создайте аккаунт администратора ).
    • Создайте один тестовый пост в блоге с заголовком “Мой первый пост”.
    • Теперь имитируем сбой. На Db-node остановите и удалите контейнер с базой данных:
      Terminal window
      docker stop db-mysql
      docker rm db-mysql
    • Убедитесь, что том mysql-data остался на месте: docker volume ls.
    • Запустите контейнер mysql еще раз, используя ту же самую команду docker run с тем же volume.
    • Обновите страницу вашего блога в браузере. Если все сделано правильно, сайт продолжит работать, и ваш “Мой первый пост” будет на месте, так как контейнер mysql подхватил все данные из тома.
  1. Что произойдет с данными внутри контейнера, если его удалить без использования volumes?
  2. В чем ключевое отличие volume от bind mount с точки зрения управления данными?
  3. Какой командой можно посмотреть список всех volumes в системе?
  4. Что произойдет, если примонтировать volume к непустой директории внутри образа? (Содержимое директории образа будет скрыто, и в контейнере будет видно содержимое тома).