Главная/Storage/Обзор

Раздел 7. Storage

По умолчанию container не хранит ничего. Всё, что записано в его файловую систему, живёт в writable layer и исчезает вместе с container при docker rm. Это не недостаток, а осознанное проектное решение: оно делает containers взаимозаменяемыми. Но приложениям нужны данные — база, загруженные файлы, кэш, — и раздел объясняет, как их сохранять правильно.

Три механизма решают разные задачи: volumes для данных приложения, bind mounts для доступа к файлам host, tmpfs для временных данных, которые не должны попадать на диск. Выбор между ними — не вопрос вкуса: он определяет производительность, переносимость, права доступа и то, кто отвечает за резервное копирование.

Отдельно разбираются две проблемы, на которые уходит больше всего времени у разработчиков: несовпадение UID/GID между host и container и «пропажа» файлов образа под bind mount.

Цели обучения

После раздела учащийся сможет:

  • объяснить, что происходит с данными при остановке, перезапуске и удалении container;
  • выбрать между named volume, anonymous volume, bind mount и tmpfs под конкретную задачу;
  • создавать, инспектировать и удалять volumes, находить их данные на host;
  • объяснить, почему bind mount скрывает файлы, находящиеся в образе по тому же пути;
  • диагностировать и исправлять ошибки прав доступа без chmod 777;
  • запустить container с read-only root filesystem и определить, каким каталогам нужна запись;
  • выполнить backup и restore volume проверяемым способом;
  • найти и безопасно удалить orphaned volumes;
  • объяснить, почему монтирование исходного кода в разработке — это компромисс, а не универсальное решение.

Предварительные знания

Материалы

  1. Файловая система container
    Writable layer: где он находится, что с ним происходит при stop, start и rm. Стоимость записи через copy-on-write. Почему запись больших объёмов в container layer — плохая идея. Обзор трёх механизмов хранения и критерии выбора.

  2. Volumes
    Named и anonymous volumes. Управление через docker volume. Где физически лежат данные. Синтаксис -v против --mount и почему второй предпочтительнее. Volume drivers как обзор. Автоматическое наполнение пустого volume содержимым образа — единственный случай, когда это происходит.

  3. Bind mounts
    Монтирование каталога host. Абсолютные пути и их последствия для переносимости. Read-only bind mounts. Почему bind mount скрывает содержимое образа по этому пути и как это диагностировать. SELinux-контексты :z и :Z как отдельное замечание для RHEL-подобных систем.

  4. tmpfs и read-only filesystem
    --tmpfs и --mount type=tmpfs: данные в памяти, ограничение размера, отсутствие следов на диске. Запуск с --read-only: что при этом ломается в типичном Python-приложении и какие каталоги нужно вернуть в запись.

  5. Права доступа, UID и GID
    Почему файлы, созданные в container, принадлежат root на host. Совпадение UID как единственный работающий механизм. Четыре рабочих решения и их trade-offs. Почему chmod 777 не решение, а маскировка проблемы. Поведение при rootless Docker.

  6. Backup и restore
    Резервное копирование volume через вспомогательный container. Консистентность бэкапа базы данных: почему копирование файлов на живой БД небезопасно. Восстановление и проверка. Orphaned volumes: как находить и безопасно удалять.

  7. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → exercises.

Урок 05 — самый практически ценный в разделе. Если время ограничено, не пропускайте его: проблема UID/GID встречается практически в каждом проекте с bind mount.

Практические задания

ЗаданиеТип
1Записать данные в container, удалить container, показать, что данные потеряны; повторить с volumeобяз.
2Найти на host физическое расположение данных named volumeобяз.
3Смонтировать каталог host поверх каталога с файлами в образе и объяснить наблюдаемоеобяз.
4Воспроизвести проблему UID/GID: файл, созданный в container, не удаляется с host обычным пользователемобяз.
5Исправить задание 4 тремя разными способами и сравнить ихобяз.
6Запустить Python-приложение с --read-only и подобрать минимальный набор tmpfsдоп.
7Сделать backup volume с PostgreSQL, удалить volume, восстановить, проверить данныедоп.
8Найти все anonymous volumes без containers и удалить их безопаснодоп.
9После docker compose down данные базы исчезли. Найти причину в конфигурациидиаг.
10Организовать разработку с bind mount так, чтобы созданные приложением файлы принадлежали текущему пользователю host

Полные формулировки — в exercises.md.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Объяснить разницу между volume и bind mount с точки зрения владения данными и переносимости.
  2. Сказать, что произойдёт с данными при docker rm и при docker rm -v.
  3. Объяснить, почему после монтирования каталога с кодом «пропал» установленный в образе пакет.
  4. Исправить ошибку Permission denied при записи в volume от non-root пользователя.
  5. Сделать и восстановить backup volume, подтвердив целостность данных.
  6. Назвать, какие каталоги нужно смонтировать как tmpfs для Python-приложения с --read-only.

Проверьте себя: Quiz 07.

Что дальше

Данные сохраняются. Следующий раздел решает вторую задачу многокомпонентной системы: как containers находят друг друга и как до них добраться снаружи.

Навигация

← Предыдущий раздел: Python внутри Container
Вернуться к главному оглавлению
Следующий раздел: Docker Networking →

Markdown на GitHub ↗