Введение / Зачем это нужно
Docker volumes — это предпочтительный способ сохранения данных, генерируемых или используемых контейнерами Docker. В отличие от связывания (bind mounts) или tmpfs, тома полностью управляются Docker, что обеспечивает переносимость, простоту бэкапов и миграции. В этом гайде вы научитесь создавать, монтировать и управлять томами в Linux, чтобы ваши данные (базы данных, логи, конфиги) оставались безопасными после остановки или удаления контейнера.
Требования / Подготовка
Перед началом убедитесь, что:
- Установлен Docker Engine (версия 19.03 или новее). Проверьте:
docker --version. - Учётная запись имеет права на управление Docker (обычно группа
docker). - Доступ к терминалу Linux (Ubuntu, CentOS, Debian или другая дистрибутив).
- Базовое понимание команд Docker (
run,ps,exec).
Создание и использование томов
Шаг 1: Создание тома
Создайте именованный том с помощью docker volume create. Docker сохранит его в /var/lib/docker/volumes/ (по умолчанию).
# Создание тома с именем 'my_data'
docker volume create my_data
# Проверка списка томов
docker volume ls
Том создан, но ещё не связан с контейнером.
Шаг 2: Монтирование тома в контейнер
Запустите контейнер, смонтировав том в указанный путь внутри контейнера. Данные, записанные в этот путь, сохранятся в томе.
# Запуск контейнера с томом, смонтированным в /app/data
docker run -d \
--name my_container \
-v my_data:/app/data \
nginx:alpine
Или с помощью синтаксиса --mount (более явный):
docker run -d \
--name my_container \
--mount source=my_data,target=/app/data \
nginx:alpine
Шаг 3: Проверка работы тома
Добавьте данные в смонтированный путь и убедитесь, что они персистентны.
# Зайдите в контейнер
docker exec -it my_container sh
# Внутри контейнера создайте файл
echo "Тестовые данные" > /app/data/test.txt
exit
# Запустите второй контейнер с тем же томом
docker run --rm \
-v my_data:/app/data \
alpine cat /app/data/test.txt
Вывод: Тестовые данные — том работает.
Шаг 4: Управление томами
Просмотр информации о томе
docker volume inspect my_data
Вывод содержит путь на хосте, точки монтирования, драйвер.
Удаление тома
# Удаление конкретного тома (только если ни один контейнер его не использует)
docker volume rm my_data
# Принудительное удаление (если том используется, сначала остановите контейнеры)
docker volume rm -f my_data
# Очистка всех неиспользуемых томов
docker volume prune
Работа с драйверами и опциями
По умолчанию используется драйвер local. Для специализированных сценариев (NFS, CIFS) укажите драйвер и опции при создании:
# Создание тома с драйвером NFS (пример)
docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.100,rw \
--opt device=:/путь/на/nfs/сервере \
nfs_volume
Проверка результата
- Том создан и отображается в
docker volume ls. - Данные, записанные в смонтированный путь, сохраняются после остановки и удаления контейнера.
- Несколько контейнеров могут одновременно использовать один том (если это не приводит к конфликтам).
- При удалении тома через
docker volume rmданные безвозвратно удаляются с хоста.
Возможные проблемы
Ошибка "volume is in use"
При удалении тома Docker проверяет, используется ли он. Остановите все контейнеры, использующие том:
docker ps -a --filter volume=my_data
docker stop $(docker ps -aq --filter volume=my_data)
docker volume rm my_data
Проблемы с правами доступа
Если контейнер не может записать в том, проверьте права на хостовой директории (для bind mounts) или настройте userns-remap для томов. Для томов local Docker управляет правами, но если том смонтирован в bind-режиме, настройте chmod на хосте.
Том не виден в указанном пути на хосте
Тома local хранятся в /var/lib/docker/volumes/. Путь внутри этой директории управляется Docker и может меняться. Для прямого доступа с хоста используйте docker run --mount type=bind (но тогда это не том, а bind mount).
Утечка данных при удалении контейнера
Тома не удаляются автоматически при удалении контейнера (в отличие от анонимных томов). Удаляйте тома явно через docker volume rm или prune, чтобы избежать накопления неиспользуемых данных.
Производительность
Для высоконагруженных БД (PostgreSQL, MySQL) используйте тома с драйвером local и опциями noatime,nodiratime в mount-опциях, или рассмотрите специализированные драйверы (например, local-persist). Избегайте NFS для интенсивных операций записи без настройки кэширования.