Bind mount — механизм монтирования директории или файла с хоста внутрь контейнера Docker. В отличие от Docker volumes (управляемых Docker), bind mount использует конкретный путь файловой системы хоста — изменения видны немедленно с обеих сторон.
Как работает
При создании bind mount ядро Linux связывает два пути файловой системы через механизм mount --bind. Содержимое хост-директории появляется в контейнере по указанному пути. Любой файл, созданный контейнером, остаётся на хосте после его остановки — в отличие от данных в слоях контейнера, которые исчезают при docker rm.
Синтаксис
# Короткий синтаксис (-v)
docker run -v /host/path:/container/path nginx
# Длинный синтаксис --mount (рекомендуется)
docker run --mount type=bind,source=/host/path,target=/container/path nginx
# Только чтение (защита от изменений контейнером)
docker run --mount type=bind,source=/etc/nginx,target=/etc/nginx,readonly nginx
# В docker-compose.yml
services:
web:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html
История
Bind mount существует в Linux с ядра 2.4.0 (2001 год) как часть VFS. Docker адаптировал этот механизм для изоляции контейнеров. Изначально bind mount был единственным способом сохранить данные — Docker Volumes появились позже как управляемая абстракция. В 2017 году Docker добавил синтаксис --mount как более явную и безопасную альтернативу флагу -v.
Bind mount vs Docker Volumes
| Критерий | Bind mount | Docker Volume |
|---|---|---|
| Управление | Путь задаёт пользователь | Docker создаёт в /var/lib/docker/volumes/ |
| Портируемость | Зависит от хоста | Переносится между хостами |
| Производительность | Прямой доступ к ФС | Чуть медленнее на macOS/Windows |
| Использование | Разработка, конфиги | Базы данных, продакшен-данные |
Практическое применение
Разработка: -v $(pwd):/app позволяет редактировать код на хосте и немедленно видеть изменения в контейнере без пересборки образа. Это стандартный подход при работе с Node.js или PHP-проектами.
Конфигурация: монтирование nginx.conf позволяет менять настройки Nginx без пересборки образа — достаточно изменить файл на хосте и перезапустить контейнер. Флаг :ro защищает от случайной записи контейнером.
Интеграция с Kubernetes: аналог bind mount в k8s — hostPath volume. Используется для доступа к сокетам хоста (например, /var/run/docker.sock для DinD) и к специфичным для узла файлам.
На что обращать внимание
Права доступа: если контейнер запускается от root (UID 0), а хост-директория принадлежит обычному пользователю, возможны конфликты. Флаг :z или :Z (на системах с SELinux) настраивает метки безопасности автоматически. Монтирование /var/run/docker.sock даёт контейнеру полный доступ к Docker-демону хоста — это серьёзная уязвимость, избегайте в продакшене.
В продакшене bind mount часто заменяют ConfigMap (в Kubernetes) или Docker secrets (в Swarm). Для персистентных данных — Docker Volumes управляемые containerd: они переживают пересоздание контейнера и легко бэкапируются через docker run --volumes-from.