Короткий ответ
Volume — управляемая Docker область хранения данных, находящаяся вне writable-слоя конкретного контейнера, которая переживает удаление контейнера и может быть подключена к другим контейнерам.
Как это работает подробнее
writable-слой контейнера удаляется вместе с самим контейнером (docker rm), поэтому данные, записанные только в него, теряются навсегда. Volume создаётся отдельно (явно через docker volume create или неявно при первом использовании) и хранится Docker-ом в собственной управляемой области на хосте (обычно /var/lib/docker/volumes/...), не зависящей от жизненного цикла контейнера.
Пример кода
Пример конфигурации
$ docker volume create pgdata
$ docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:16
$ docker rm -f db
$ docker run -d --name db2 -v pgdata:/var/lib/postgresql/data postgres:16Что использовать на практике
- Практика. volume используют для всего, что должно сохраняться между пересозданиями контейнера — данных БД, загруженных пользователями файлов, кэшей. Volume можно подключить сразу к нескольким контейнерам одновременно для обмена данными.
Подводные камни
- Риск. хранят важные данные приложения только внутри writable-слоя контейнера (без volume), а затем теряют их при обычном обновлении версии образа (
docker rm old && docker run new), потому что не связали с конкретным volume заранее.