Гид по технологиям

Docker volumes: хранение, совместное использование и резервное копирование данных

• 9 min read • DevOps • Обновлено 25 Nov 2025
Docker volumes — хранение и резервное копирование
Docker volumes — хранение и резервное копирование

Демонстрация работы Docker volumes на хосте и контейнерах

Что вы узнаете в этой статье

  • Как Docker создаёт анонимные тома по умолчанию.
  • Отличие анонимных и именованных томов и когда что использовать.
  • Пошаговые команды для создания, проверки, резервного копирования и восстановления томов.
  • Как безопасно удалять неиспользуемые тома и что нужно учитывать при использовании –rm.
  • Практические контрольные списки, SOP для бэкапа/восстановления, матрица рисков и рекомендации по безопасности.

Важное замечание: примеры в статье выполнены на Linux-хосте (в примере использован CentOS). На других дистрибутивах пути и некоторые пакеты могут отличаться.

Ключевые термины (1‑строчное определение)

  • Том (volume): отдельная область хранения данных Docker, смонтированная в контейнере, но существующая вне его образа.
  • Анонимный том: том без явного имени, создаваемый Docker автоматически для контейнера.
  • Именованный том: том с заданным пользователем именем, создаваемый командой docker volume create.

Предпосылки

  • Базовое знакомство с Docker и контейнерами.
  • Linux-хост (инструкция основана на CentOS, но применима и к другим дистрибутивам).
  • Docker установлен и запущен на хосте.
  • Учетная запись с правами root или доступом через sudo.

Если Docker не установлен — сначала выполните инструкции по установке Docker для вашей ОС.

Обнаружение анонимных Docker томов

Docker по умолчанию может создавать анонимные тома для контейнеров, которым нужно хранить данные (например, базы данных). Такие тома живут на хосте в каталоге /var/lib/docker/volumes и имеют случайные имена.

  1. Проверьте статус сервиса Docker:
sudo systemctl status docker

Статус systemd сервиса Docker

  1. (Рекомендуется) Добавьте своего пользователя в группу docker, чтобы запускать docker без sudo. После команды выйдите и снова войдите в систему, чтобы изменения вступили в силу.
sudo usermod -aG docker $(whoami)
  1. Скачайте образы, которые будем использовать в демонстрации:
docker pull postgres:12.1
docker pull bash
docker pull httpd:2.4
  1. Убедитесь, что образы загружены:
docker images
  1. Посмотрите, есть ли тома на хосте:
docker volume ls

В начале список томов, как правило, пуст.

  1. Запустите два контейнера Postgres, чтобы увидеть создание анонимных томов:
docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1
  1. Проверьте запущенные контейнеры:
docker ps

Вы увидите контейнеры db1 и db2.

  1. Снова перечислите тома на хосте — Docker должен был создать 2 анонимных тома для хранения данных Postgres:
docker volume ls

Тома будут иметь имена с случайными шестнадцатеричными суффиксами (например, e9f338… и ee3423…).

  1. Посмотрите привязки томов у контейнера db1:
docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

Вы увидите объект Mounts где указан “Name” тома и “Destination” — путь внутри контейнера.

Информация о монтах контейнера db1

  1. Аналогично для db2:
docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

Вы заметите, что имена томов разные — Docker создает отдельный анонимный том для каждого контейнера.

  1. Запустите временный контейнер с флагом –rm и посмотрите, что произойдет с томом при остановке контейнера:
docker run -d --rm --name dbTmp postgres:12.1

Проверка:

docker ps

Список контейнеров

  1. Посмотрите тома еще раз:
docker volume ls

Вы увидите третий том, созданный для dbTmp.

  1. Остановите db2 и dbTmp:
docker stop db2 dbTmp
  1. Проверьте контейнеры и тома:
docker ps
docker volume ls

Вы заметите: том для dbTmp исчез (потому что контейнер был запущен с –rm), а том для db2 остался, хотя контейнер db2 остановлен.

Важно: флаг –rm удаляет контейнер после остановки вместе с анонимно созданными ресурсами, если они не используются иными контейнерами. Если вы создаёте контейнер без –rm, анонимный том останется на хосте после остановки контейнера.


Создание именованного Docker тома и примеры использования

Именованные тома — это контролируемая и рекомендуемая практика для долговременного хранения данных.

  1. Создайте новый именованный том website:
docker volume create website
  1. Убедитесь, что том создан:
docker volume ls
  1. Скачайте код сайта в текущую рабочую директорию (в примере используется каталог из репозитория widget-factory-inc). Предполагается, что вы выполнили git clone или скачали архив в /home/cloud_user/widget-factory-inc/web/.

  2. Скопируйте код сайта в том (контент окажется в каталоге _data тома):

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/
  1. Проверьте содержимое тома на хосте:
sudo ls -l /var/lib/docker/volumes/website/_data/

Теперь код сайта хранится в именованном томе website.

  1. Запустите контейнер httpd и подключите к нему том website в режиме только чтения (ro). На хосте порт 80 проброшен в контейнер:
docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4
  1. Проверьте статус контейнера:
docker ps

Состояние контейнера web1

  1. Откройте IP-адрес хоста в браузере, чтобы увидеть сайт, если порт и правила фаервола это позволяют.

  2. Запустите временный контейнер webTmp с –rm, который также подключает том website, чтобы увидеть, как том ведёт себя при остановке временного контейнера:

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4
  1. Убедитесь, что webTmp запущен:
docker ps
  1. Остановите webTmp:
docker stop webTmp
  1. Перечислите тома:
docker volume ls

Вы увидите, что том website остался, потому что он всё ещё используется контейнером web1. Это ключевой момент: томы не удаляются при остановке контейнера, если они используются другим контейнером.


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

Тома могут занимать значительный объём дискового пространства. Docker предоставляет команды для удаления неиспользуемых ресурсов.

  1. Прежде чем удалять том, убедитесь, что ни один контейнер его не использует. Например, остановите и удалите контейнер db2, если он больше не нужен:
docker stop db2
docker rm db2
  1. Удалите висячие (dangling) ресурсы:
docker volume prune

Эта команда удалит тома, не привязанные ни к одному контейнеру. Docker попросит подтверждение.

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

  1. Перечислите тома, чтобы убедиться в результате:
docker volume ls

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

Самый простой способ сделать резервную копию содержимого тома — заархивировать каталог _data тома на хосте или запустить контейнер, который выполнит tar внутри тома.

  1. Найдите информацию о томе website, включая Mountpoint:
docker volume inspect website

В поле Mountpoint вы увидите путь, например: /var/lib/docker/volumes/website/_data

Mount point тома website

  1. Создайте tar-архив содержимого тома (выполняйте от root или через sudo, чтобы избежать проблем с правами):

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

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .
  1. Проверьте, что архив создан:
ls -l /tmp/website_*.tgz
  1. Просмотрите содержимое архива, чтобы убедиться, что данные сохранены:
tar tf /tmp/.tgz

Проверка архива

  1. Альтернативный способ: запустите вспомогательный контейнер bash и создайте архив внутри контейнера, примонтировав и том, и /tmp:
docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .
  1. Для тестирования восстановления можно временно удалить все файлы в томе и затем распаковать резервную копию:
  • Перейдите в директорию тома (например через контейнер) и удалите файлы.
  • Восстановление:
tar xf .tgz .
  • Проверьте содержимое:
ls -l

Практические советы и подводные камни

  • Не используйте анонимные тома для длительного хранения данных — они труднее отслеживаются.
  • Для production используйте именованные тома и заявленную стратегию бэкапа.
  • Флаг –rm удобен для временных тестов, но может удалить данные, если том был единственным держателем данных и не примонтирован куда-либо ещё.
  • По умолчанию тома хранятся в /var/lib/docker/volumes — учитывайте размер диска этого раздела.
  • Контейнеры с проброшенными портами могут скрывать конфликты портов — следите за портами 80/443 и т.д.

Советы по безопасности и соответствию требованиям приватности

  • Ограничьте доступ к каталогу /var/lib/docker/volumes через файловые права и политики доступа.
  • Шифруйте резервные копии при переносе или хранении вне защищённого хранилища.
  • При работе с персональными данными соблюдайте требования локального законодательства и GDPR: документируйте, какие данные хранятся в томах и обеспечьте механизмы удаления и архивации.

Дополнительные подходы и альтернативы

  • Bind mounts: монтирование конкретной папки хоста в контейнер. Используется для разработки, но менее удобно для переносимости.
  • Сетевые тома (NFS, CIFS) или плагины хранения (например, для облачных дисков): подходят для мультихостовых кластеров.
  • Решения уровня оркестратора (Kubernetes PersistentVolumes) предлагают динамическую поставку хранилища и политик хранения.

Когда идеальнее использовать именованные тома:

  • Производственные данные приложений.
  • Долговременное хранение логов и баз данных.

Когда использовать bind mounts:

  • Локальная разработка, когда нужно быстро вносить изменения в код.

Мини‑методология управления томами (4 шага)

  1. Планирование: определите какие данные нужно сохранять, периодичность бэкапа, RTO/RPO.
  2. Создание: создайте именованные тома и определите политики доступа.
  3. Проверка: тестируйте запуск контейнеров с томами и восстановление из бэкапов.
  4. Поддержка: регулярно очищайте неиспользуемые тома и автоматизируйте бэкап.

Факт‑бокс: ключовые пути и команды

  • Каталог томов на хосте: /var/lib/docker/volumes/
  • Создать том: docker volume create
  • Перечислить тома: docker volume ls
  • Инспектировать том: docker volume inspect
  • Удалить неиспользуемые: docker volume prune
  • Создать архив: tar czf /tmp/backup.tgz -C /var/lib/docker/volumes//_data .

Роль‑ориентированные контрольные списки

Администратор:

  • Проверить статус Docker сервиса.
  • Настроить регулярные бэкапы для критических томов.
  • Настроить мониторинг использования диска на /var/lib/docker.

Разработчик:

  • Использовать bind mounts для локальной разработки.
  • Развертывать приложение с именованными томами в staging.

SRE/операции:

  • Тестировать восстановление из бэкапа раз в цикл (например, ежемесячно).
  • Автоматизировать очистку висячих томов в safe window.

Матрица рисков и меры смягчения

  • Переполнение диска на хосте: следить за метриками использования, настраивать оповещения.
  • Утеря бэкапа: шифровать и хранить копии в нескольких местах, тестировать восстановление.
  • Некорректные права доступа: применять минимально необходимые права и аудит изменений.

SOP: Быстрый план резервного копирования и восстановления тома

SOP — регулярный бэкап тома website (пример на уровне команды):

  1. Создать папку для хранения бэкапов: sudo mkdir -p /backup/docker
  2. Создать архив:
sudo tar czf /backup/docker/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .
  1. Проверить целостность архива: tar tf /backup/docker/<имя_архива>.tgz
  2. Перенести копию в удалённое хранилище (scp/rsync/облачный бакет).
  3. Протестировать восстановление в staging перед применением в production.

Восстановление (из архива в каталог тома):

  1. Остановить контейнеры, использующие том.
  2. Распаковать архив в каталог тома (от root):
sudo tar xf /backup/docker/<имя_архива>.tgz -C /var/lib/docker/volumes/website/_data
  1. Проверить права и владельцев файлов.
  2. Запустить контейнеры и протестировать приложение.

Решение «когда удалить том» — простая диаграмма

flowchart TD
  A[Найден том] --> B{Том привязан к контейнеру?}
  B -- Да --> C[Не удалять: том используется]
  B -- Нет --> D{Есть бэкап?}
  D -- Нет --> E[Создать бэкап или пометить на хранение]
  D -- Да --> F[Удалить том с docker volume rm ]

Часто задаваемые вопросы

Q: Удалится ли том при удалении контейнера?
A: Только если контейнер запускался с флагом –rm и том не используется другими контейнерами. Именованные тома не удаляются автоматически при удалении контейнера.

Q: Можно ли переносить том между хостами?
A: Да — создайте архив содержимого каталога _data и разверните его на другом хосте в аналогичный каталог тома.


Критерии приёмки (проверки успешности)

  • Контейнер успешно монтирует том и видит файлы после старта.
  • Создан архив резервной копии и успешно распакован в тестовой среде.
  • После очистки неиспользуемых томов свободное место увеличилось, при этом важные данные не потеряны.

Вывод

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

Если хотите углубиться дальше, изучите интеграцию с сетевыми хранилищами, плагинами объемов и решениями оркестрации для мультихостовой архитектуры.


Краткое объявление для команды (100–200 слов):

Docker volumes теперь стандартизированы: мы создаём именованные тома для всех production баз данных и сайтов, регулярно делаем резервные копии в /backup и тестируем восстановление. Временные контейнеры — с флагом –rm — можно использовать для тестов, но помните, что они удаляют сопутствующие анонимные ресурсы. Администратор отвечает за политику бэкапа и мониторинг дискового пространства в /var/lib/docker/volumes.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро