Как работает технология общих папок (shared folders) в контексте виртуализации и контейнеризации?

«Как работает технология общих папок (shared folders) в контексте виртуализации и контейнеризации?» — вопрос из категории Виртуализация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps общие папки (shared folders) — это механизм для предоставления хосту и гостевой системе (виртуальной машине или контейнеру) доступа к одной и той же директории на файловой системе. Это критически важно для разработки, отладки и персистентного хранения данных.

1. В классической виртуализации (VirtualBox, VMware): Механизм работает через драйверы гостевой ОС, которые транслируют файловые операции в сетевые протоколы (виртуальные) или специальные системные вызовы гипервизору.

  • Пример с Vagrant и VirtualBox (Vagrantfile):
       Vagrant.configure("2") do |config|
         config.vm.box = "ubuntu/focal64"
         # Синхронизация папки ./src на хосте с /vagrant_data в гостевой ОС
         config.vm.synced_folder "./src", "/vagrant_data"
       end

    Это позволяет редактировать код на хосте в привычной IDE, а запускать его внутри VM.

2. В Docker (Bind Mounts и Volumes): Docker предоставляет более изящные и производительные механизмы.

  • Bind Mount: Прямое монтирование конкретного пути с хоста в контейнер.
       # Монтируем локальную папку ./app в контейнер по пути /usr/share/nginx/html
       docker run -v $(pwd)/app:/usr/share/nginx/html:ro -d nginx

    Изменения на хосте мгновенно видны в контейнере (и наоборот). Флажок :ro делает монтирование read-only для безопасности.

  • Docker Volume: Управляемый Docker'ом именованный том, независимый от хоста. Лучшая практика для данных.
       # Создание тома
       docker volume create myapp-data
       # Использование тома
       docker run -v myapp-data:/var/lib/mysql -d mysql

    Том хранится в /var/lib/docker/volumes/ на хосте, но управляется через Docker CLI. Это обеспечивает персистентность данных при удалении контейнера.

Ключевые отличия для DevOps:

  • Производительность: Bind mounts на Linux используют механизм ядра inotify и обычно быстрее, чем сетевые шары в VM.
  • Переносимость: Volumes — стандартный кроссплатформенный способ Docker для хранения данных.
  • Безопасность: Важно правильно выставлять UID/GID и права (в Linux) и использовать :ro где возможно, чтобы контейнер не мог изменить критичные файлы хоста.