Как смонтировать каталог хоста в контейнер 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
Если у вас есть много файлов для монтирования таким образом, вы можете поместить их все в один и тот же каталог хоста и смонтировать этот каталог в другое место в контейнере. Затем вы можете использовать символические ссылки внутри контейнера, чтобы связать файлы в смонтированном каталоге с нужным расположением.