Тома Docker: постоянное хранение данных контейнеров

Практическая работа с томами Docker: создание, подключение, проверка, резервное копирование и безопасное удаление.

Файловая система контейнера не предназначена для постоянного хранения важных данных. При удалении и пересоздании контейнера изменения внутри него могут быть потеряны.

Тома Docker позволяют хранить данные отдельно от жизненного цикла контейнера.

В этой инструкции рассматриваются только базовые операции с Docker volumes: создание, подключение, проверка, резервное копирование и удаление.

Проверено на: Ubuntu Server 24.04 LTS и Docker Engine
Уровень сложности: начальный
Время выполнения: около 15 минут
Требуемый доступ: пользователь с доступом к Docker

Что будет рассмотрено

В статье показано, как:

  • создать том;
  • подключить его к контейнеру;
  • проверить сохранность данных;
  • использовать том в Docker Compose;
  • посмотреть расположение и свойства тома;
  • создать резервную копию;
  • восстановить данные;
  • удалить неиспользуемый том.

Что такое Docker volume

Docker volume — это управляемое Docker хранилище, существующее независимо от контейнера.

Основные свойства:

  • том не удаляется при обычном удалении контейнера;
  • один том можно подключать к разным контейнерам;
  • Docker управляет местом хранения;
  • том можно резервировать отдельно;
  • том удобно использовать в Docker Compose.

Просмотр существующих томов

docker volume ls

Подробная информация:

docker volume inspect VOLUME_NAME

Создание тома

Создайте том:

docker volume create example-data

Проверьте:

docker volume ls

Посмотрите параметры:

docker volume inspect example-data

Подключение тома к контейнеру

Запустите тестовый контейнер:

docker run -d   --name volume-example   -v example-data:/data   alpine   sh -c 'while true; do sleep 3600; done'

Том example-data будет подключён в контейнер как:

/data

Создание файла в томе

docker exec volume-example   sh -c 'echo "persistent data" > /data/test.txt'

Проверьте содержимое:

docker exec volume-example   cat /data/test.txt

Ожидаемый результат:

persistent data

Проверка сохранности после удаления контейнера

Удалите контейнер:

docker rm -f volume-example

Убедитесь, что том остался:

docker volume ls

Создайте новый контейнер с тем же томом:

docker run --rm   -v example-data:/data   alpine   cat /data/test.txt

Ожидаемый результат:

persistent data

Это подтверждает, что данные находятся в томе, а не внутри удалённого контейнера.

Подключение тома только для чтения

docker run --rm   -v example-data:/data:ro   alpine   cat /data/test.txt

Параметр:

:ro

означает read-only.

Попытка записи должна завершиться ошибкой:

docker run --rm   -v example-data:/data:ro   alpine   sh -c 'echo test > /data/new.txt'

Использование тома в Docker Compose

Создайте каталог проекта:

mkdir -p ~/volume-compose-example
cd ~/volume-compose-example

Создайте compose.yaml:

cat >compose.yaml <<'EOF'
services:
  app:
    image: alpine
    container_name: volume-compose-app
    command:
      - sh
      - -c
      - while true; do sleep 3600; done
    volumes:
      - app-data:/data

volumes:
  app-data:
EOF

Проверьте конфигурацию:

docker compose config

Запустите проект:

docker compose up -d

Проверьте:

docker compose ps

Запись данных через Compose

docker compose exec app   sh -c 'echo "compose volume" > /data/compose.txt'

Проверьте:

docker compose exec app   cat /data/compose.txt

Имя тома в Compose

Compose обычно добавляет к имени тома префикс проекта.

Проверьте:

docker volume ls

Имя может выглядеть так:

volume-compose-example_app-data

Точное имя зависит от имени каталога проекта или параметра name.

Фиксированное имя тома

Чтобы задать точное имя:

volumes:
  app-data:
    name: app-data

После этого том будет называться:

app-data

Внешний том

Если том уже существует и не должен создаваться Compose:

volumes:
  app-data:
    external: true

Перед запуском создайте его:

docker volume create app-data

Затем:

docker compose up -d

Просмотр точек монтирования контейнера

docker inspect   --format '{{json .Mounts}}'   volume-compose-app

Для более читаемого вывода:

docker inspect volume-compose-app |
jq '.[0].Mounts'

Где физически хранится том

Путь можно увидеть через:

docker volume inspect example-data

Поле:

Mountpoint

обычно указывает на каталог внутри:

/var/lib/docker/volumes/

Важно: не изменяйте содержимое томов вручную без необходимости. Для работы с данными безопаснее использовать временный контейнер.

Просмотр содержимого тома

docker run --rm   -v example-data:/data   alpine   ls -la /data

Просмотр файла:

docker run --rm   -v example-data:/data   alpine   cat /data/test.txt

Резервное копирование тома

Создайте каталог для резервной копии:

mkdir -p ~/docker-volume-backups

Создайте архив:

docker run --rm   -v example-data:/source:ro   -v ~/docker-volume-backups:/backup   alpine   tar -czf /backup/example-data.tar.gz -C /source .

Проверьте:

ls -lh ~/docker-volume-backups/

Проверьте содержимое архива:

tar -tzf ~/docker-volume-backups/example-data.tar.gz

Восстановление в новый том

Создайте новый том:

docker volume create example-data-restored

Распакуйте архив:

docker run --rm   -v example-data-restored:/target   -v ~/docker-volume-backups:/backup:ro   alpine   tar -xzf /backup/example-data.tar.gz -C /target

Проверьте данные:

docker run --rm   -v example-data-restored:/data   alpine   cat /data/test.txt

Резервное копирование активного приложения

Для обычных файлов копирование работающего тома может быть допустимо, но для баз данных этого недостаточно.

Перед резервным копированием базы данных необходимо:

  • остановить запись;
  • использовать штатный инструмент дампа;
  • либо применять согласованный snapshot-механизм.

Простое архивирование активного каталога базы данных не гарантирует консистентность.

Удаление тома

Том нельзя удалить, если он используется контейнером.

Удалите тестовый контейнер:

docker rm -f volume-compose-app

Удалите том:

docker volume rm example-data-restored

Остановка Compose-проекта без удаления тома

docker compose down

Именованный том останется.

Проверьте:

docker volume ls

Удаление Compose-проекта вместе с томами

docker compose down -v

Осторожно: параметр -v удаляет именованные тома проекта и данные внутри них.

Перед выполнением проверьте резервную копию.

Поиск неиспользуемых томов

docker volume ls -f dangling=true

Подробно:

docker volume ls   -f dangling=true   --format '{{.Name}}'

Удаление неиспользуемых томов

docker volume prune

Docker запросит подтверждение.

Без подтверждения:

docker volume prune -f

Важно: команда удаляет все неиспользуемые локальные тома. Перед очисткой проверьте список.

Проверка использования диска Docker

docker system df

Подробный вывод:

docker system df -v

Для файловой системы сервера:

sudo du -sh /var/lib/docker/volumes

Volume и bind mount

Том Docker:

volumes:
  - app-data:/data

Bind mount:

volumes:
  - ./data:/data

Различие:

  • volume управляется Docker;
  • bind mount указывает на конкретный каталог хоста;
  • volume удобнее для переносимых Compose-конфигураций;
  • bind mount удобен для файлов, которые требуется редактировать напрямую на хосте.

Типичные проблемы

Том не удаляется

Проверьте контейнеры:

docker ps -a   --filter volume=VOLUME_NAME

Удалите или пересоздайте использующий его контейнер.

После docker compose down данные исчезли

Проверьте, не использовался ли параметр:

-v

Также убедитесь, что использовался именованный том, а не временное хранилище внутри контейнера.

Compose создал том с неожиданным именем

Проверьте:

docker volume ls

При необходимости задайте:

name: app-data

Контейнер не может записывать данные

Проверьте права внутри тома:

docker compose exec app   ls -ld /data

Проверьте пользователя контейнера:

docker compose exec app   id

Проблема обычно связана с UID, GID или режимом read-only.

Резервная копия базы данных не восстанавливается

Для базы данных используйте штатный инструмент:

  • pg_dump для PostgreSQL;
  • mysqldump для MySQL и MariaDB;
  • специализированный механизм приложения.

Архив каталога не всегда является корректной резервной копией базы данных.

Быстрый набор команд

Создать том:

docker volume create VOLUME_NAME

Посмотреть тома:

docker volume ls

Проверить том:

docker volume inspect VOLUME_NAME

Подключить к контейнеру:

docker run --rm   -v VOLUME_NAME:/data   alpine   ls -la /data

Создать резервную копию:

docker run --rm   -v VOLUME_NAME:/source:ro   -v "$PWD":/backup   alpine   tar -czf /backup/volume-backup.tar.gz -C /source .

Удалить том:

docker volume rm VOLUME_NAME

Итог

После выполнения инструкции:

  • создан Docker volume;
  • том подключён к контейнеру;
  • подтверждена сохранность данных после удаления контейнера;
  • показано использование в Docker Compose;
  • создана резервная копия;
  • выполнено восстановление в новый том;
  • рассмотрено безопасное удаление.

Для production-сервисов политика резервного копирования должна учитывать тип данных и согласованность приложения.

← Предыдущая статья Базовая работа с Docker Compose Следующая статья → Сети Docker: базовая настройка связи между контейнерами