Для чего нужны Docker volumes
DevOpsдокерконтейнерытомахранилище
Что проверяют
Понимаете ли вы, что контейнер одноразовый, а данные нет. Заодно смотрят, различаете ли типы монтирования.
Как отвечать
Записываемый слой контейнера исчезает вместе с контейнером. Том это способ хранить данные вне этого слоя, чтобы они пережили пересоздание, обновление образа и перезапуск.
Три способа отдать контейнеру данные:
- именованный том: Docker сам управляет местом хранения. Основной вариант для баз данных, загруженных файлов, состояния приложений;
- монтирование каталога хоста: удобно в разработке, чтобы код в контейнере обновлялся вместе с правками, но привязывает к структуре каталогов хоста и приносит вопросы с правами доступа;
- временное хранилище в памяти (
tmpfs): для секретов и временных файлов, которые не должны попадать на диск.
Что стоит добавить:
- производительность: именованный том быстрее монтирования каталога хоста на macOS и Windows, где файловая система пробрасывается через виртуальную машину;
- резервные копии: том можно скопировать отдельным контейнером, примонтировав его и заархивировав содержимое;
- права доступа: процесс в контейнере часто работает не от root, и владельца каталога тома нужно согласовать, иначе появятся отказы в записи;
- очистка: неиспользуемые тома не удаляются вместе с контейнером, за ними следят командой очистки, иначе диск постепенно забивается.
Где спотыкаются
Хранят данные базы внутри контейнера и теряют их при обновлении образа.
Монтируют каталог хоста в продакшене и получают зависимость от конкретной машины.
Забывают, что том сохраняет старое содержимое: изменили содержимое образа, а в томе осталось прежнее, и приложение ведёт себя странно.