← Назад к вопросам

Как наследуется монтирование в Linux для работы Docker

1.8 Middle🔥 132 комментариев
#Docker и контейнеризация#Linux и администрирование

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Наследование точек монтирования в пространствах имён Linux для Docker

В контексте Docker и контейнеризации наследование монтирования — это механизм пространств имён Linux, в частности пространства имён mount (mnt), который позволяет процессам внутри контейнера "видеть" определённые точки монтирования хостовой системы или, наоборот, изолировать их.

Базовые принципы наследования

Когда Docker запускает контейнер, он создаёт новое пространство имён mount, которое по умолчанию изолировано от хостовой системы. Однако существует несколько механизмов наследования или передачи монтирований:

  1. Наследование точки монтирования при создании пространства имён
    При создании нового пространства имён монтирования все существующие точки монтирования хостовой системы копируются в новое пространство. Но с флагом CLONE_NEWNS (который используется для создания новых mnt-пространств) и при установке флага MS_PRIVATE или MS_SLAVE на определённые точки монтирования, можно контролировать, как изменения распространяются между пространствами.

  2. Флаги распространения (propagation flags)
    Эти флаги определяют, как монтирования будут распространяться между пространствами имён:

    • MS_SHARED: изменения в монтировании распространяются в обе стороны (и в хостовое, и в дочерние пространства).
    • MS_PRIVATE: изменения изолированы (никакое пространство не видит изменения другого).
    • MS_SLAVE: изменения от "мастера" (хоста) распространяются в "подчинённое" пространство (контейнер), но не наоборот.
    • MS_UNBINDABLE: делает точку монтирования недоступной для bind-mount в другие пространства.

Практическая реализация в Docker

В Docker наследование монтирования контролируется при запуске контейнера, особенно для томов (volumes) и bind-mounts.

Пример bind-mount с наследованием

Когда вы монтируете каталог хоста в контейнер, вы можете задать флаг распространения:

docker run -v /host:/container:shared -it ubuntu bash

Но по умолчанию Docker использует rprivate (рекурсивно приватный) для всех монтирований, что изолирует контейнер.

Проверка текущих флагов распространения

На хосте можно посмотреть флаги для конкретной точки монтирования:

findmnt -o TARGET,PROPAGATION /
# Или детально для каталога
cat /proc/self/mountinfo | grep '/mnt/data'

В выводе будет указано, например: shared, private, slave.

Управление наследованием через Docker Daemon

На уровне демона Docker можно настроить распространение для определённых путей. Например, в /etc/docker/daemon.json:

{
  "mounts": [
    {
      "source": "/mnt/shared",
      "target": "/mnt/shared",
      "type": "bind",
      "bind-propagation": "rshared"
    }
  ]
}

После этого перезапустите демон: systemctl restart docker.

Пример: общий доступ к NFS внутри контейнеров

Если на хосте смонтирован NFS и нужно, чтобы контейнеры имели к нему доступ с наследованием:

# На хосте монтируем NFS с флагом shared
mount -t nfs nfs-server:/path /mnt/nfs -o rw,shared

# Запускаем контейнер с bind-mount этого каталога
docker run -v /mnt/nfs:/nfs:rshared -it alpine sh

Теперь, если на хосте изменить содержимое /mnt/nfs, контейнер увидит изменения, и наоборот.

Ключевые сценарии использования

  • Разделяемые данные: несколько контейнеров работают с одними данными на хосте (например, общий кэш).
  • Изоляция безопасности: запрет наследования системных путей (например, /proc, /sys).
  • Динамическое обновление: монтирование конфигурационных файлов, которые можно обновлять без перезапуска контейнера.

Важные ограничения

  • Флаги распространения применяются рекурсивно ко всем подмонтированиям внутри каталога.
  • Изменение флагов на работающем контейнере требует глубокого вмешательства в пространства имён.
  • Некоторые файловые системы (например, tmpfs) могут не поддерживать все флаги распространения.

Наследование монтирований в Linux — мощный инструмент для управления изоляцией и общим доступом в Docker, но требующий аккуратного применения, чтобы не скомпрометировать безопасность или стабильность системы.

Как наследуется монтирование в Linux для работы Docker | PrepBro