Docker volume: создать, подключить, удалить и сохранить данные

Категория: docker · Язык: Bash · Обновлено:

Том (volume) в Docker хранит данные отдельно от контейнера: они переживают его удаление и пересоздание. Создать том можно командой docker volume create имя, а подключить при запуске ключом -v имя:/путь/в/контейнере.

Основные команды

Bash
docker volume create app-data              # создать том
docker volume ls                           # список томов
docker volume inspect app-data             # подробности и путь на хосте
docker volume rm app-data                  # удалить том
docker volume prune                        # удалить анонимные тома, которыми никто не пользуется
docker volume prune -a                     # удалить и именованные тома без контейнеров

Начиная с Docker 23 обычный docker volume prune не трогает именованные тома, это защищает данные. Ключ -a включает их в очистку.

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

Bash
docker run -d --name db -v app-data:/var/lib/data alpine sleep 1000
docker run --rm -v app-data:/var/lib/data alpine sh -c "echo hello > /var/lib/data/note.txt"
docker run --rm -v app-data:/var/lib/data alpine cat /var/lib/data/note.txt

Если тома с таким именем нет, Docker создаст его сам. Данные в томе остаются после docker rm db.

Том или bind mount

Том (volume)

Bind mount

Запись

-v app-data:/data

-v $(pwd)/data:/data или -v /srv/data:/data

Где лежат данные

В хранилище Docker

В указанной папке хоста

Управление

docker volume ...

Как обычные файлы

Подходит для

Баз данных, постоянных данных

Исходного кода при разработке, конфигов

Ключ -v с абсолютным путём слева означает bind mount, с простым именем слева том. Новая запись через --mount выглядит подробнее:

Bash
docker run --rm --mount type=volume,source=app-data,target=/data alpine ls /data
docker run --rm --mount type=bind,source="$(pwd)",target=/data,readonly alpine ls /data

Только для чтения

Bash
docker run --rm -v app-data:/data:ro alpine sh -c "touch /data/x"

Суффикс :ro запрещает запись: команда touch выше завершится ошибкой.

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

Bash
# сохранить том в архив в текущей папке
docker run --rm -v app-data:/data -v "$(pwd)":/backup alpine tar -czf /backup/app-data.tar.gz -C /data .

# восстановить архив в новый том
docker volume create app-data-restored
docker run --rm -v app-data-restored:/data -v "$(pwd)":/backup alpine tar -xzf /backup/app-data.tar.gz -C /data

Тома в Docker Compose

YAML
services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Команда docker compose down тома не удаляет. Чтобы удалить и их, добавьте -v: docker compose down -v.

Что делать с томом, который нельзя удалить

Сообщение volume is in use означает, что том используется контейнером, даже остановленным. Найдите и удалите контейнер:

Bash
docker ps -a --filter volume=app-data
docker rm -f db
docker volume rm app-data

Частые вопросы

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

Путь показывает docker volume inspect в поле Mountpoint, на Linux это /var/lib/docker/volumes/имя/_data. В Docker Desktop данные лежат внутри виртуальной машины.

Чем отличаются именованный и анонимный тома?

У анонимного тома случайное имя из хеша. Он создаётся, если указать только путь контейнера: -v /data. Такие тома трудно отслеживать, поэтому используйте именованные.