Docker volumes — постоянное хранилище данных контейнера

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

Вся рубрика 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:/pathDocker управляет (/var/lib/docker/volumes/)Базы данных, постоянные данные
Bind mount-v /host/path:/container/pathКонкретная папка хостаРазработка, конфиги
tmpfs mount--tmpfs /pathRAM (только пока контейнер работает)Секреты, временные файлы

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.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x