Постоянное хранилище в контейнерах

В некоторых случаях важно, чтобы приложение могло сохранять данные в контейнере или чтобы в контейнер можно было добавить файлы, которые не были включены во время его сборки. Постоянное хранилище можно предоставить контейнерам несколькими способами:

  • Привязка подключений
  • Именованные тома

Docker имеет отличный обзор использования томов , поэтому лучше сначала прочитать это. Остальная часть этой страницы посвящена различиям между Linux и Windows и предоставляет примеры в Windows.

Привязка подключений

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

Примечание.

Привязка подключения непосредственно в общих томах кластера (CSV) не поддерживается, так как виртуальные машины, выполняющие роль узла контейнера, могут работать в томе CSV.

Разрешения

Модель разрешений, используемая для привязываемых подключений, зависит от уровня изоляции контейнера.

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

Контейнеры Windows, использующие изоляцию процессов, немного отличаются, поскольку они используют идентификатор процесса в контейнере для доступа к данным (списки управления доступом учитываются). Удостоверение процесса, выполняемого в контейнере ("Контейнер Администратор istrator" в Windows Server Core и ContainerUser в контейнерах Nano Server, по умолчанию) будет использоваться для доступа к файлам и каталогам в подключенном томе, а не LocalSystemк использованию данных.

Так как эти идентификаторы существуют только в контексте контейнера, а не на узле, где хранятся файлы, вам следует использовать известную группу безопасности, например Authenticated Users, при настройке списков управления доступом для предоставления доступа к контейнерам.

Предупреждение

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

Пример использования:

  • docker run -v c:\ContainerData:c:\data:RO в случае доступа только для чтения;
  • docker run -v c:\ContainerData:c:\data:RW в случае доступа для чтения и записи;
  • docker run -v c:\ContainerData:c:\data в случае доступа для чтения и записи (по умолчанию).

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

Подключения S МБ

В Windows Server версии 1709 и более поздних доступна функция, "Глобальное сопоставление SMB", которая позволяет подключить общую папку SMB на узле, а затем передать каталоги из этой папки в контейнер. Контейнеру не нужно настраивать определенный сервер, общий доступ, имя пользователя или пароль. Это все обрабатывается на узле. Контейнер будет работать так же, как если бы он имел локальное хранилище.

Шаги настройки

  1. На узле контейнера глобально сопоставьте удаленную общую папку SMB.

    $creds = Get-Credential
    New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
    

    Эта команда будет использовать учетные данные для проверки подлинности на удаленном сервере SMB. Затем сопоставите путь удаленной общей папки с буквой диска G (может быть любой другой доступной буквой диска). Контейнеры, созданные на этом узле контейнера, теперь могут сопоставить тома данных с путем на диске G: .

    Примечание.

    При использовании глобального сопоставления SMB для контейнеров всем пользователям на узле контейнера предоставляется доступ к удаленной общей папке. Любое приложение, работающее на узле контейнера, также будет иметь доступ к сопоставленной удаленной общей папке.

  2. Создайте контейнеры с томами данных, сопоставленными с глобально подключенной общей папкой SMB: docker run -it --name demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe

    Внутри контейнера папка c:\AppData1 будет сопоставлена с каталогом "ContainerData" удаленной общей папки. Все данные, хранящиеся в глобально сопоставленном удаленном ресурсе, будут доступны приложениям внутри контейнера. Несколько контейнеров могут получить доступ на чтение и запись к этим общим данным с одной и той же командой.

Эта поддержка глобального сопоставления S МБ — это функция S МБ на стороне клиента, которая может работать на любом совместимом сервере S МБ включая:

  • Масштабируемый файловый сервер поверх Локальные дисковые пространства (S2D) или традиционного SAN
  • Файлы Azure (S МБ share)
  • Традиционный файловый сервер
  • 3-й сторонней реализации протокола S МБ (например, NAS (модуль))

Примечание.

S МБ глобальное сопоставление не поддерживает папки DFS Namespaces (DFSN). Например, при сопоставлении корневой папки New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1'DFSN с целевыми объектами папок этого корневого каталога возвращается сообщение "Сетевое расположение невозможно достичь".

Именованные тома

Именованные тома позволяют создать том по имени, назначить его контейнеру и повторно использовать его позже с тем же именем. Вам не нужно отслеживать фактический путь к тому, где он был создан, просто имя. Подсистема Docker в Windows имеет встроенный подключаемый модуль с именем тома, который может создавать тома на локальном компьютере. Для использования именованных томов на нескольких компьютерах требуется дополнительный подключаемый модуль.

Примеры действий.

  1. docker volume create unwound — создание тома с именем "unwound".
  2. docker run -v unwound:c:\data microsoft/windowsservercore — запуск контейнера с томом, сопоставленным с каталогом c:\data.
  3. Запись некоторых файлов в C:\data в контейнере, а затем остановка контейнера
  4. docker run -v unwound:c:\data microsoft/windowsservercore — запуск нового контейнера.
  5. Запуск dir c:\data в новом контейнере — файлы по-прежнему существуют

Примечание.

Windows Server будет преобразовывать целевые пути (пути внутри контейнера) в нижний регистр. Таким образом использование -v unwound:c:\MyData или -v unwound:/app/MyData в контейнерах Linux приведет к созданию внутри сопоставляемых (и созданных в случае отсутствия) контейнеров Linux каталога c:\mydata или /app/mydata.