Поиск по сайту:

Как смонтировать каталог хоста в контейнер Docker


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

Зачем монтировать с хоста?

Как правило, с Docker вы хотите, чтобы образы запускались независимо от хост-системы. Если вы хотите, например, обновить код приложения или файлы конфигурации, вы, вероятно, захотите создать новую версию контейнера и повторно развернуть. Это позволяет быстро масштабировать и перемещать изображения, не беспокоясь об оборудовании, на котором они работают.

Однако в среде разработки возможность прямого монтирования каталога для включения горячей перезагрузки конфигурации или кода может быть очень полезной. Например, вы можете работать с JS-файлом или PHP-плагином, который можно просто перетащить в контейнер. Или вы можете захотеть смонтировать весь каталог конфигурации NGINX для работы на вашем веб-сайте. Каким бы ни был ваш вариант использования, монтирование файлов — неплохое решение.

Это также полезно в производственной среде, если у вас есть хост-сервисы, которые зависят от файлов в контейнерах. Например, у вас может быть служба приема и агрегации журналов, которая предпочла бы, чтобы файлы журналов контейнера находились в каталоге, доступном с хоста. Хотя, вероятно, есть некоторые решения ваших проблем в Docker, иногда проще просто смонтировать том.

Совместимость с macOS

Примечание: поскольку монтирование выполняется через Docker API, оно будет работать независимо от операционной системы хоста. Однако macOS имеет дополнительную защиту, и монтирование за пределами нескольких каталогов хоста может завершиться ошибкой с «монтированием запрещено» во время выполнения. Это включает в себя /Users, который охватывает большинство операций, но если вам нужно, вы можете исправить это в настройках Docker в разделе «Настройки»> «Ресурсы»> «Общий доступ к файлам», добавив целевой каталог в список.

Монтирование каталога хоста

Создать привязку довольно просто. Добавьте его с флагом --mount type=bind при запуске, указав исходный и целевой каталоги для подключения.

docker run -d 
-it 
--name container 
--mount type=bind,source=/nginxconfig,target=/etc/nginx 
nginx:latest

Подключения с привязкой являются самыми простыми, но Docker предоставляет Volume API для управления такими видами подключения немного лучше. Сохраненные данные будут управляться Docker, а каталог тома будет автоматически создан в каталоге Docker. Это может быть не то, что вам нужно, если вы имеете в виду существующий каталог, но этот метод лучше, поскольку он не зависит от файловой структуры хост-ОС.

docker volume create nginx-config

docker run -d 
--name devtest 
--mount source=nginx-config,target=/etc/nginx 
nginx:latest

Вы также можете использовать Docker Compose для определения томов:

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - nginx-config:/etc/nginx/
volumes:
  nginx-config:

Они хранятся в стандартном формате, доступном для Linux:

/var/lib/docker/volumes/volumeID/_data

Однако в macOS вам потребуется подключиться к виртуальной машине Docker, чтобы иметь возможность просматривать тома.

Монтирование отдельных файлов

Монтирование целых каталогов хорошо работает, когда вы хотите отредактировать множество файлов конфигурации/кода, хранящихся на хосте. Однако иногда вам может понадобиться просто смонтировать один файл для редактирования, не касаясь других файлов.

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

docker run -it 
--mount type=bind,source=/path/file.cfg,target=/etc/example/file.cfg 
nginx sh

Если у вас есть много файлов для монтирования таким образом, вы можете поместить их все в один и тот же каталог хоста и смонтировать этот каталог в другое место в контейнере. Затем вы можете использовать символические ссылки внутри контейнера, чтобы связать файлы в смонтированном каталоге с нужным расположением.