Docker volume: создать, подключить, удалить и сохранить данные
Том (volume) в Docker хранит данные отдельно от контейнера: они переживают его удаление и пересоздание. Создать том можно командой docker volume create имя, а подключить при запуске ключом -v имя:/путь/в/контейнере.
Основные команды
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 включает их в очистку.
Подключить том к контейнеру
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 | |
|---|---|---|
Запись |
|
|
Где лежат данные | В хранилище Docker | В указанной папке хоста |
Управление |
| Как обычные файлы |
Подходит для | Баз данных, постоянных данных | Исходного кода при разработке, конфигов |
Ключ -v с абсолютным путём слева означает bind mount, с простым именем слева том. Новая запись через --mount выглядит подробнее:
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Только для чтения
docker run --rm -v app-data:/data:ro alpine sh -c "touch /data/x"Суффикс :ro запрещает запись: команда touch выше завершится ошибкой.
Резервная копия и восстановление тома
# сохранить том в архив в текущей папке
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
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 означает, что том используется контейнером, даже остановленным. Найдите и удалите контейнер:
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. Такие тома трудно отслеживать, поэтому используйте именованные.