Короткий ответ
Bind mount монтирует конкретный, заранее известный путь файловой системы хоста внутрь контейнера; named volume — это область хранения, полностью управляемая самим Docker, физическое расположение которой не нужно знать пользователю.
Как это работает подробнее
при bind mount (-v /host/path:/container/path) пользователь сам указывает и контролирует путь на хосте — файлы там видны и редактируемы обычными средствами ОС вне Docker. При named volume (-v myvolume:/container/path) Docker сам создаёт и обслуживает хранилище, абстрагируя пользователя от реального расположения на диске; доступ к содержимому идёт только через Docker-команды или сам контейнер.
Пример кода
Пример конфигурации
docker run -v /srv/app/config:/app/config myapp
docker run -v app_config:/app/config myappЧто использовать на практике
- Практика. bind mount удобен для разработки (например, монтирование исходного кода проекта для live-перезагрузки) и для доступа к специфическим файлам хоста (сертификаты, сокеты). Named volume предпочтителен для production-данных приложений (БД, очереди), так как не зависит от конкретной структуры файловой системы хоста и лучше переносится между хостами через backup/restore драйверов volume.
Подводные камни
- Риск. используют bind mount на production для данных БД, жёстко привязывая развёртывание к конкретному пути конкретного хоста, что усложняет миграцию на другой сервер или оркестратор.