Тома 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-сервисов политика резервного копирования должна учитывать тип данных и согласованность приложения.