Раздел 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;
- объяснить, почему монтирование исходного кода в разработке — это компромисс, а не универсальное решение.
Предварительные знания
- Раздел 04. Containers и lifecycle — создание и удаление containers;
- Раздел 03. Работа с Images — writable layer и copy-on-write;
- Раздел 06. Python внутри Container — желательно, примеры используют non-root user;
- понимание прав доступа Linux: владелец, группа, биты
rwx, UID и GID.
Материалы
-
Файловая система container
Writable layer: где он находится, что с ним происходит приstop,startиrm. Стоимость записи через copy-on-write. Почему запись больших объёмов в container layer — плохая идея. Обзор трёх механизмов хранения и критерии выбора. -
Volumes
Named и anonymous volumes. Управление черезdocker volume. Где физически лежат данные. Синтаксис-vпротив--mountи почему второй предпочтительнее. Volume drivers как обзор. Автоматическое наполнение пустого volume содержимым образа — единственный случай, когда это происходит. -
Bind mounts
Монтирование каталога host. Абсолютные пути и их последствия для переносимости. Read-only bind mounts. Почему bind mount скрывает содержимое образа по этому пути и как это диагностировать. SELinux-контексты:zи:Zкак отдельное замечание для RHEL-подобных систем. -
tmpfs и read-only filesystem
--tmpfsи--mount type=tmpfs: данные в памяти, ограничение размера, отсутствие следов на диске. Запуск с--read-only: что при этом ломается в типичном Python-приложении и какие каталоги нужно вернуть в запись. -
Права доступа, UID и GID
Почему файлы, созданные в container, принадлежатrootна host. Совпадение UID как единственный работающий механизм. Четыре рабочих решения и их trade-offs. Почемуchmod 777не решение, а маскировка проблемы. Поведение при rootless Docker. -
Backup и restore
Резервное копирование volume через вспомогательный container. Консистентность бэкапа базы данных: почему копирование файлов на живой БД небезопасно. Восстановление и проверка. Orphaned volumes: как находить и безопасно удалять. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 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.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Объяснить разницу между volume и bind mount с точки зрения владения данными и переносимости.
- Сказать, что произойдёт с данными при
docker rmи приdocker rm -v. - Объяснить, почему после монтирования каталога с кодом «пропал» установленный в образе пакет.
- Исправить ошибку
Permission deniedпри записи в volume от non-root пользователя. - Сделать и восстановить backup volume, подтвердив целостность данных.
- Назвать, какие каталоги нужно смонтировать как
tmpfsдля Python-приложения с--read-only.
Проверьте себя: Quiz 07.
Что дальше
Данные сохраняются. Следующий раздел решает вторую задачу многокомпонентной системы: как containers находят друг друга и как до них добраться снаружи.
Навигация
← Предыдущий раздел: Python внутри Container
Вернуться к главному оглавлению
Следующий раздел: Docker Networking →