Docker Volume — механизм постоянного хранения данных для Docker-контейнеров. Данные в контейнере эфемерны: при удалении контейнера всё его внутреннее содержимое теряется. Volume — смонтированная директория вне файловой системы контейнера, данные в которой сохраняются независимо от жизненного цикла контейнера.
Типы хранилищ данных в Docker
- Named Volume: управляется Docker, хранится в
/var/lib/docker/volumes/.docker volume create mydata - Bind Mount: монтирование конкретной директории хоста.
-v /host/path:/container/path - tmpfs: хранение в RAM, без сохранения на диск. Для временных данных.
Использование volumes
# Создать volume
docker volume create postgres_data
# Запустить контейнер с volume
docker run -d --name postgres -v postgres_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16
# В docker-compose.yml
services:
db:
image: postgres:16
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
# Список volumes
docker volume ls
# Удалить volume
docker volume rm postgres_data
# Удалить все неиспользуемые volumes
docker volume prune
История
Docker Volumes появились в Docker 1.0 (2014). До volumes данные хранились только внутри контейнера или через неудобные механизмы --volumes-from. Docker 1.9 (2015) ввёл named volumes и плагины для хранилищ. Плагины (Volume Drivers) позволяют хранить данные на NFS, AWS EBS, Ceph, GlusterFS — вне локального диска хоста. В Kubernetes аналоги: PersistentVolume (PV) и PersistentVolumeClaim (PVC).
Volumes vs Bind Mount
| Параметр | Named Volume | Bind Mount |
|---|---|---|
| Управление | Docker | Пользователь |
| Путь на хосте | Автоматически | Явно указывается |
| Бэкап | docker volume inspect + cp | Стандартные инструменты |
| Применение | БД, продакшн-данные | Разработка (синхронизация кода) |
| Совместимость с Windows | Высокая | Проблемы с путями |
На что обращать внимание
Никогда не храни данные баз данных (PostgreSQL, MySQL) без volume — при пересоздании контейнера данные потеряются. Для бэкапа volume: docker run --rm -v postgres_data:/data -v /backup:/backup alpine tar czf /backup/db.tar.gz /data. В Docker Swarm named volumes локальны для ноды — для общего хранилища нужен NFS-volume driver или внешний storage (Ceph, GlusterFS). В Kubernetes volumes описываются через PersistentVolumeClaim + StorageClass.
История Docker Volumes
Концепция Volume появилась в Docker 1.0 (2013) для решения проблемы эфемерности данных в контейнерах. До Docker 1.9 (2015) volumes были анонимными — при удалении контейнера терялись. Docker 1.9 ввёл именованные volumes (Named Volumes) с независимым жизненным циклом. Docker 1.10 (2016) добавил Volume Plugins — возможность подключать внешние хранилища (NFS, Ceph, GlusterFS). Bind mounts существовали с самого начала Docker, но они зависимы от структуры файловой системы хоста.
Volume vs Bind mount vs tmpfs
| Тип | Данные хранятся | Управление | Применение |
|---|---|---|---|
| Named Volume | Управляется Docker (/var/lib/docker/volumes/) | Docker CLI | БД, persistent data |
| Bind mount | Любой путь хоста | ОС хоста | Dev: монтирование кода |
| tmpfs | RAM хоста | Docker CLI | Временные секреты, кэш |
На что обращать внимание
Named Volumes — рекомендуемый способ хранения данных для MySQL, PostgreSQL, Redis в Docker. Данные volumes не удаляются при docker-compose down — только при docker-compose down -v. Бэкап volume: docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz /data. В Docker Swarm Named Volumes локальны для ноды — для shared storage нужен NFS-driver или внешний storage. В Kubernetes volumes описываются через PersistentVolumeClaim + StorageClass.