Основные понятия хранилища для контейнеров
Контейнеры Windows по умолчанию используют эфемерное хранилище (временное пространство) для всех входных и выходных данных. Каждый контейнер имеет собственное временное пространство, в котором создаются и записываются все файлы, чтобы они не переходили на хост. При удалении экземпляра контейнера все изменения, произошедшие в временном пространстве, удаляются. При запуске нового экземпляра контейнера для него предоставляется новое временное пространство.
Хранилище слоев
Все контейнеры создаются из образов контейнеров. Образ контейнера — это пакет файлов, организованных в стек слоев (называемых хранилищем слоев), который находится на локальном компьютере или в удаленном реестре контейнеров. Образ контейнера состоит из файлов операционной системы в пользовательском режиме, необходимых для:
- Поддержка приложения
- Любая среда выполнения приложения
- Зависимости приложения
- Любые другие другие файлы конфигурации, необходимые для правильного выполнения приложения.
В среде Windows слои хранятся с помощью CimFS и поддерживаются в NTFS (новая технология файловой системы), ReFS или RefDisks для хранилища слоев. Вы можете изменить место хранения файлов с помощью конфигурации docker-root
(или эквивалентного с контейнером), но не следует изменять файлы в каталогах слоев. Они тщательно управляются с помощью docker (или эквивалентных команд).
Постоянное хранилище
У вас могут возникнуть случаи, когда приложение должно иметь возможность сохранять данные в контейнере. Или вы можете хранить файлы в контейнере, который не был включен во время сборки контейнера. Вы можете предоставить постоянное хранилище контейнерам Windows несколькими способами:
- Привязка точек монтирования
- Именованные тома
Привязка подключений
Бинд-маунты позволяют контейнеру делиться каталогом с хостом, сопоставляя каталог на хосте с каталогом внутри контейнера. Привязанные монтирования полезны, если требуется место для хранения файлов на локальном компьютере, доступное при перезапуске контейнера и потере временного пространства. Или, если вы хотите предоставить общий доступ к файлу с несколькими контейнерами.
Однако если вы хотите, чтобы контейнер выполнялся на нескольких компьютерах с доступом к тем же файлам, то вместо этого следует использовать подключение именованного тома или SMB (блок сообщений сервера). Важно, чтобы не привязывать конфиденциальные каталоги, например C:\
, в ненадежный контейнер. Эта привязка позволит ему изменять файлы на узле, к которому он обычно не имеет доступа и может создать нарушение безопасности.
В следующем примере показана команда Docker для создания бинд-маунта папки C:\ContainerData
на хосте в C:\data
внутри контейнера с доступом по умолчанию на чтение и запись.
docker run -v c:\ContainerData:c:\data
Именованные тома
Именованные тома позволяют создать том с конкретным именем, назначить его контейнеру и использовать его повторно позже с тем же именем. Тома дают возможность создавать и управлять специально выделенным на узле местом для хранения данных контейнера. Вам не нужно отслеживать путь создания, достаточно знать имя.
Подсистема Docker в Windows имеет встроенный модуль именованных томов, который может создавать тома на локальном компьютере. Если вы хотите использовать именованные тома на нескольких компьютерах, требуется другой подключаемый модуль.
В следующем примере показаны команды Docker для создания и запуска контейнера с именем mycontainer, сопоставленного с локальным томом c:data
:
docker volume create myvolume
docker run -v myvolume:c:\data microsoft/windowsservercore
Хотя подключения привязки зависят от структуры каталогов и операционной системы (ОС) хост-компьютера, Docker полностью управляет томами. Тома имеют несколько преимуществ привязываемых подключений:
- Тома проще создавать резервные копии или переносить, чем связывания точек монтирования.
- Вы можете управлять томами с помощью команд Командной строки Docker или API Docker.
- Томы работают в контейнерах Linux и Windows.
- Томами можно более безопасно делиться между несколькими контейнерами.
- Драйверы томов позволяют хранить тома на удаленных узлах или поставщиках облачных служб, шифровать содержимое томов или добавлять другие функции.
- Новые тома могут быть предварительно заполнены контейнером.
Кроме того, тома часто предпочтительнее, чем сохранять данные в доступном для записи слое контейнера (временная область). Том не увеличивает размер контейнеров, использующих его (как и привязка), и содержимое тома существует вне жизненного цикла конкретного контейнера.