Одна из главных проблем при работе с контейнерами — данные внутри них непостоянны. Если контейнер удалить, всё, что хранилось в его файловой системе, исчезнет. Именно для этого в Docker есть volumes — механизм для надежного хранения данных вне жизненного цикла контейнера.
Что такое Docker Volume
Docker Volume — это специальное хранилище, которым управляет сам Docker. Оно нужно для:
- сохранения данных после пересоздания контейнера
- обмена данными между контейнерами
- хранения БД, логов, файлов приложения
- упрощения резервного копирования и миграции
Проще говоря, контейнер можно удалить и запустить заново, а данные в volume останутся. 🔒
Почему не хранить данные внутри контейнера
- при удалении контейнера они потеряются
- обновление образа усложняется
- переносимость снижается
- резервное копирование становится неудобным
Для PostgreSQL, MySQL, Redis, Elasticsearch и других stateful-сервисов volumes — обязательная практика.
Основные команды ⚙️
Создать volume:
docker volume create app_data
Посмотреть список:
docker volume ls
Информация о volume:
docker volume inspect app_data
Удалить:
docker volume rm app_data
Подключить volume к контейнеру:
docker run -d \
--name postgres \
-v app_data:/var/lib/postgresql/data \
postgres
В этом примере данные PostgreSQL будут храниться в volume app_data, а не внутри контейнера.
Volumes vs Bind Mounts
Частый поисковый вопрос — что выбрать: volume или bind mount.
Volumes
- управляются Docker
- лучше подходят для production
- проще переносить между окружениями
- безопаснее и чище в эксплуатации
Bind mounts
- монтируют папку с хоста
- удобны в разработке
- подходят для live-редактирования кода
- сильнее зависят от структуры файловой системы сервера
Итого:
- для БД и постоянных данных — volume
- для локальной разработки — часто bind mount 🛠️
Пример в Docker Compose
services:
db:
image: postgres
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
Такой подход делает конфигурацию читаемой и упрощает деплой.
Лучшие практики ✅
- давайте volume понятные имена
- не храните важные данные без бэкапов
- отделяйте данные приложения от контейнера
- используйте volumes для всех stateful-сервисов
- регулярно проверяйте, какие volumes больше не используются
Вывод
Docker Volumes — базовый инструмент для стабильной работы контейнеров с данными. Они помогают переживать перезапуски, обновления и пересоздание контейнеров без потери информации. Для production-среды это не опция, а стандарт. 🚀
📌 Ниже стоит посмотреть подборку каналов про IT — там много полезного про Docker, DevOps, backend и инфраструктуру.