Контейнер эфемерен: данные внутри него исчезают при удалении. Docker volumes решают эту проблему — они хранят данные вне контейнера, на хосте, и переживают любые операции с контейнером.

- Зачем нужны volumes
- Три типа монтирования
- Named volumes — управляемые Docker
- Bind mounts — папка с хоста
- Volumes в Docker Compose
- Резервная копия volume
- Права доступа к volumes
- Часто задаваемые вопросы
- Где физически хранятся Docker volumes?
- Как скопировать данные из volume?
- docker volume vs bind mount — что выбрать?
- Что читать дальше по Docker
Зачем нужны volumes
# БЕЗ volume — данные исчезают при удалении контейнера
docker run -d --name my-postgres -e POSTGRES_PASSWORD=secret postgres
# ... работаешь с базой, заливаешь данные ...
docker rm -f my-postgres # ← все данные удалены безвозвратно!
# С volume — данные сохраняются
docker run -d \
--name my-postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
docker rm -f my-postgres # данные в volume — целы!
# Поднять новый контейнер — данные вернутся
docker run -d \
--name my-postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
Три типа монтирования
| Тип | Синтаксис | Где хранится | Когда использовать |
|---|---|---|---|
| Named volume | -v myvolume:/path | Docker управляет (/var/lib/docker/volumes/) | Базы данных, постоянные данные |
| Bind mount | -v /host/path:/container/path | Конкретная папка хоста | Разработка, конфиги |
| tmpfs mount | --tmpfs /path | RAM (только пока контейнер работает) | Секреты, временные файлы |
Named volumes — управляемые Docker
# Создать volume заранее
docker volume create pgdata
# Список volumes
docker volume ls
# DRIVER VOLUME NAME
# local pgdata
# Информация о volume
docker volume inspect pgdata
# "Mountpoint": "/var/lib/docker/volumes/pgdata/_data"
# Использовать при запуске контейнера
docker run -d \
--name my-postgres \
-v pgdata:/var/lib/postgresql/data \
postgres:16
# Удалить volume (только если не используется)
docker volume rm pgdata
# Удалить все неиспользуемые
docker volume prune
Bind mounts — папка с хоста
# Монтировать текущую папку в контейнер
docker run -v $(pwd):/app myapp
# Конкретная папка хоста
docker run -v /home/user/config:/app/config myapp
# Только для чтения (:ro)
docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx
# Разработка — код меняется на хосте, сразу виден в контейнере
docker run -d \
--name flask-dev \
-v $(pwd):/app \
-p 5000:5000 \
my-flask-app
# Редактируешь app.py → изменения видны в контейнере без пересборки
Volumes в Docker Compose
version: "3.9"
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data # named volume
environment:
POSTGRES_PASSWORD: secret
app:
image: myapp
volumes:
- ./app:/app # bind mount — для разработки
- ./config:/app/config:ro # конфиги только для чтения
- /tmp/cache:/app/cache # абсолютный путь хоста
# Объявить named volumes здесь
volumes:
pgdata: # Docker создаст автоматически при запуске
Резервная копия volume
# Создать backup через временный контейнер
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/mydata-backup.tar.gz -C /data .
# Проверить
ls -lh mydata-backup.tar.gz
# Восстановить из backup
docker volume create mydata-restored
docker run --rm \
-v mydata-restored:/data \
-v $(pwd):/backup \
ubuntu \
tar xzf /backup/mydata-backup.tar.gz -C /data
# Проверить содержимое
docker run --rm -v mydata-restored:/data ubuntu ls /data
Права доступа к volumes
# Проблема: файлы создаются от root внутри контейнера
docker run -v $(pwd):/app ubuntu touch /app/file.txt
ls -la file.txt
# -rw-r--r-- root root ← нельзя редактировать с хоста!
# Решение 1: указать UID:GID пользователя хоста
docker run --user $(id -u):$(id -g) -v $(pwd):/app ubuntu touch /app/file.txt
ls -la file.txt
# -rw-r--r-- username username ✅
# Решение 2: использовать именованный volume — проблемы с правами нет
# Docker сам управляет правами
Часто задаваемые вопросы
Где физически хранятся Docker volumes?
Named volumes хранятся в /var/lib/docker/volumes/ИМЯ/_data на хосте (Linux). Путь можно узнать через docker volume inspect имя — поле Mountpoint. На macOS и Windows Docker Desktop запускает Linux VM — volumes находятся внутри этой VM, не в обычной файловой системе. Напрямую обращаться к данным volume через файловый менеджер не рекомендуется — используй временный контейнер.
Как скопировать данные из volume?
Способ 1 — через временный контейнер: docker run --rm -v mydata:/data -v $(pwd):/backup ubuntu tar czf /backup/data.tar.gz -C /data . Способ 2 — docker cp из контейнера: docker cp my-container:/app/data ./local-data. Способ 3 — напрямую с хоста (только Linux, нужен root): sudo cp -r /var/lib/docker/volumes/mydata/_data ./backup.
docker volume vs bind mount — что выбрать?
Named volume — для баз данных и постоянных данных в продакшне: Docker управляет местом хранения, лучшая производительность на Linux, работает одинаково на всех платформах. Bind mount — для разработки: монтируешь папку с кодом, изменения видны сразу без пересборки образа. Также для передачи конфигов. Общее правило: данные приложения → named volume, код при разработке → bind mount.
Что читать дальше по Docker
Чтобы связать тему с соседними практическими материалами, дальше удобно открыть:
- Docker backup — настроить резервное копирование данных.
- PostgreSQL в Docker — подключить volume для PostgreSQL.
- Redis в Docker — сохранить данные Redis между перезапусками.
- docker-compose.yml — описать volumes в docker-compose.yml.



