Как работает хранение данных в Docker: Volumes и Bind Mounts
Введение
В этом руководстве вы узнаете, как работает хранение данных в Docker и как сохранять данные с помощью Docker Volumes и Bind Mounts. Вы также поймете ключевые различия между этими подходами и когда использовать каждый из них в production. Это поможет избежать потери данных и спроектировать надежные контейнеризированные системы.
Предварительные требования
- Целевая аудитория: начинающие системные администраторы
- Примерное время: ~30 минут
- Операционная система: любая ОС с поддержкой Docker, например Ubuntu 22.04+, Debian 12+, CentOS Stream или macOS с Docker Desktop
- ПО: Docker 24.0.0 или новее
- Права: пользователь с доступом к Docker или sudo-привилегиями
- Аппаратные требования: минимум 2 ГБ ОЗУ и 10 ГБ свободного дискового пространства
- Сеть: доступ в Интернет для загрузки образов контейнеров
- Базовые знания: основы работы с командной строкой и понимание контейнеров
Шаг 1: Понимание работы хранения данных в Docker
Контейнеры Docker используют слоистую файловую систему. Каждый контейнер имеет записываемый слой поверх неизменяемых слоев образа.
Что происходит при записи данных в контейнер
- Docker хранит слои образа как read-only
- При запуске контейнера Docker добавляет записываемый слой
- Все изменения файлов происходят только в этом записываемом слое
Результат
При удалении контейнера все данные в записываемом слое теряются. Это означает, что хранение данных в контейнере по умолчанию является эфемерным.
Такое поведение подходит для stateless-приложений, но не для баз данных или сервисов с постоянным хранением.
Шаг 2: Создание и использование Docker Volumes
Docker Volumes — это управляемые Docker области хранения данных.
Создание тома
Выполните команду:
docker volume create my_volume
В ответ вы увидите имя тома.
Использование тома в контейнере
Выполните команду:
docker run -d -v my_volume:/app/data --name volume_test busybox
Docker монтирует том в контейнер по пути /app/data.
Результат
Данные, записанные в /app/data, сохраняются даже после удаления контейнера.
Ключевые характеристики volumes
- Управляются Docker
- Хранятся во внутренних директориях Docker, например
/var/lib/docker/volumes/ - Удобны для резервного копирования и миграции
- Изолированы от структуры файловой системы хоста
Используйте volumes для баз данных и production-нагрузок.
Шаг 3: Создание и использование Bind Mounts
Bind mounts связывают конкретную директорию на хосте с директорией внутри контейнера.
Использование bind mount
Выполните команду:
docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox
Результат
Контейнер напрямую обращается к директории на хосте. Любые изменения на хосте сразу видны внутри контейнера.
Ключевые характеристики bind mounts
- Зависят от путей файловой системы хоста
- Позволяют напрямую редактировать файлы с хоста
- Не имеют изоляции, управляемой Docker
- Более гибкие, но менее переносимые
Bind mounts мгновенно отражают изменения между хостом и контейнером.
Шаг 4: Сравнение Volumes и Bind Mounts
Понимание различий помогает выбрать правильный вариант.
Docker Volumes
- Управляются Docker
- Переносимы между окружениями
- Безопаснее для production
- Проще в резервном копировании
- Абстрагированы от файловой системы хоста
Bind Mounts
- Управляются хостом
- Привязаны к конкретным путям
- Удобны для разработки
- Обеспечивают прямой доступ к файлам
- Менее безопасны при неправильной настройке
Шаг 5: Выбор между Volumes и Bind Mounts в production
Используйте следующие рекомендации.
Когда использовать Docker Volumes
- Запуск баз данных, например MySQL или PostgreSQL
- Хранение данных приложения, которые должны сохраняться
- Развертывание production-сервисов
- Необходимость переносимости между серверами
Когда использовать Bind Mounts
- Локальная разработка
- Прямое редактирование кода или конфигурации
- Отладка поведения контейнера
- Временные или тестовые окружения
Важно: Bind mounts могут открыть доступ контейнеру к чувствительным файлам хоста при неправильной настройке. Всегда проверяйте пути и права доступа.
Проверка и тестирование
Создайте тестовый контейнер с volume:
docker run -it -v my_volume:/data --name playground busybox
Внутри контейнера создайте файл:
echo test > /data/file.txt
Выйдите из контейнера и удалите его:
docker rm -f playground
Запустите новый контейнер с тем же volume:
docker run -it -v my_volume:/data --name playground busybox
Проверьте файл:
cat /data/file.txt
Ожидаемый результат: файл существует, что подтверждает сохранность данных.
Откат изменений
Для очистки ресурсов выполните команды:
docker rm -f playground volume_test bind_test
docker volume rm my_volume
docker system prune -f
Важно: Удаление volumes безвозвратно удаляет все данные.
Устранение неполадок
- Проблема: данные исчезают после перезапуска контейнера
Причина: не используется volume или bind mount
Решение: подключите постоянное хранилище - Проблема: ошибка permission denied
Причина: несовпадение прав доступа
Решение: используйтеchmodилиchown - Проблема: volume не монтируется
Причина: неверный путь или синтаксис
Решение: проверьте формат и пути
Заключение и дальнейшие шаги
Вы узнали, как работает хранение данных в Docker и как сохранять данные с помощью volumes и bind mounts. Теперь вы понимаете, когда использовать каждый подход в production. Далее изучите Docker Compose для управления multi-container приложениями и декларативного описания хранилища.