Для чего нужны Docker volumes
Что проверяют
Понимаете ли вы, что файловая система контейнера временная, и умеете ли выбрать тип монтирования под задачу. Следом обычно спрашивают, чем volume отличается от bind mount и где в вашем docker-compose лежат данные Postgres.
Как отвечать
Контейнер пишет в свой верхний слой overlay2, который живёт ровно столько, сколько сам контейнер: docker stop его сохраняет, docker rm удаляет. Всё, что должно пережить пересоздание контейнера, выносится наружу:
- named volume:
docker volume create pgdataили секцияvolumes:в compose. Лежит в области Docker (/var/lib/docker/volumesна Linux), управляется черезdocker volume ls,inspect,rm. Типичный случай:pgdata:/var/lib/postgresql/dataдля базы Django или FastAPI приложения; - bind mount: папка хоста,
./src:/app. Нужен в разработке, чтобыuvicorn --reloadилиrunserverвидели правки без пересборки образа; - tmpfs: в памяти, на диск не пишется. Для временных файлов и того, что не должно остаться после остановки;
- anonymous volume: создаётся инструкцией
VOLUMEв Dockerfile или-v /pathбез имени, ссылку на него легко потерять.
Полезная деталь: пустой named volume при первом монтировании заполняется содержимым образа по этому пути, а bind mount его просто перекрывает. Отсюда приём с отдельным volume под /app/.venv, чтобы bind mount кода не затёр зависимости, установленные при сборке.
Про производительность: на Linux volume и bind mount работают почти одинаково, заметная разница есть на Docker Desktop под macOS и Windows, где bind mount идёт через файловый шаринг виртуальной машины. И оба быстрее записи в слой контейнера.
Где спотыкаются
Говорят, что данные пропадают при остановке контейнера. Пропадают при удалении, а ещё при docker compose down -v: флаг удаляет и named volumes из compose-файла.
Копируют каталог Postgres через tar на живой базе и называют это бэкапом. Нужен pg_dump или остановка контейнера перед копированием тома, иначе копия может оказаться неконсистентной.
Забывают про права: процесс в контейнере работает под своим UID, и файлы, созданные в bind mount, на хосте принадлежат root или чужому пользователю.