Лабораторная работа №3: Управление данными (Volumes)
Цель работы
Section titled “Цель работы”Научиться использовать volumes (тома) для сохранения данных stateful-приложений (таких как базы данных) и обеспечить их персистентность (сохранность) независимо от жизненного цикла контейнера.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Stateless vs Stateful приложения
Section titled “1. Stateless vs Stateful приложения”- Stateless (без состояния): Приложения, которые не хранят никаких данных между запросами. Веб-сервер, который отдает статические файлы — классический пример. Такие контейнеры можно безболезненно удалять и создавать заново.
- Stateful (с состоянием): Приложения, которые хранят данные, изменяющиеся со временем. Любая база данных — это stateful-приложение. Если удалить такой контейнер, все накопленные данные будут потеряны.
2. Файловая система контейнера
Section titled “2. Файловая система контейнера”Каждый контейнер имеет свою собственную изолированную файловую систему. Когда контейнер удаляется (docker rm), его файловая система уничтожается вместе со всеми данными, которые были в ней созданы.
3. Volumes (Тома)
Section titled “3. Volumes (Тома)”Volumes — это предпочтительный механизм для сохранения данных, генерируемых и используемых Docker-контейнерами.
- Тома полностью управляются Docker (
docker volume create,docker volume ls). - Они хранятся в специальной директории на хост-машине (например,
/var/lib/docker/volumes/), но пользователю не следует напрямую изменять файлы в ней. - Том можно одновременно подключить к нескольким контейнерам.
- Тома не удаляются автоматически при удалении контейнера, что и обеспечивает сохранность данных.
- Рекомендуемая литература: Manage data in Docker (Документация Docker)
4. Bind Mounts
Section titled “4. Bind Mounts”Альтернативный механизм, который “пробрасывает” файл или директорию с хост-машины в контейнер. В отличие от volumes, bind mounts полностью зависят от структуры файловой системы хоста. Они полезны для разработки, когда нужно “вживую” редактировать код на хосте и видеть изменения в контейнере.
- Рекомендуемая литература: Bind mounts (Документация Docker)
Задания для выполнения
Section titled “Задания для выполнения”-
Создание и использование 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 хранит все свои файлы данных.
- На
-
Проверка сохранности данных:
- На
Web-nodeзапустите контейнерghost(как в прошлой работе). - Откройте в браузере
http://<ip-Web-node>:8080/ghost, пройдите первоначальную настройку (создайте аккаунт администратора ). - Создайте один тестовый пост в блоге с заголовком “Мой первый пост”.
- Теперь имитируем сбой. На
Db-nodeостановите и удалите контейнер с базой данных:Terminal window docker stop db-mysqldocker rm db-mysql - Убедитесь, что том
mysql-dataостался на месте:docker volume ls. - Запустите контейнер
mysqlеще раз, используя ту же самую командуdocker runс тем жеvolume. - Обновите страницу вашего блога в браузере. Если все сделано правильно, сайт продолжит работать, и ваш “Мой первый пост” будет на месте, так как контейнер
mysqlподхватил все данные из тома.
- На
Контрольные вопросы
Section titled “Контрольные вопросы”- Что произойдет с данными внутри контейнера, если его удалить без использования
volumes? - В чем ключевое отличие
volumeотbind mountс точки зрения управления данными? - Какой командой можно посмотреть список всех
volumesв системе? - Что произойдет, если примонтировать
volumeк непустой директории внутри образа? (Содержимое директории образа будет скрыто, и в контейнере будет видно содержимое тома).