Freigeben über


Beständiger Speicher in Containern

Möglicherweise gibt es Fälle, in denen es wichtig ist, dass eine Anwendung in der Lage ist, Daten permanent in einem Container zu speichern, oder Sie möchten Dateien in einem Container anzeigen, die bei der Erstellung des Containers nicht enthalten waren. Persistenter Speicher kann Containern auf verschiedene Arten zugewiesen werden:

  • Mounts einbinden
  • Benannte Volumes

Docker hat eine großartige Übersicht über die Verwendung von Volumes , damit es am besten ist, das zuerst zu lesen. Der Rest dieser Seite konzentriert sich auf Unterschiede zwischen Linux und Windows und enthält Beispiele für Windows.

Bindungsbereitstellungen

Binden Sie Bereitstellungen , damit ein Container ein Verzeichnis für den Host freigeben kann. Dies ist nützlich, wenn Sie dateien auf dem lokalen Computer speichern möchten, die verfügbar sind, wenn Sie einen Container neu starten oder für mehrere Container freigeben möchten. Wenn der Container auf mehreren Computern mit Zugriff auf dieselben Dateien ausgeführt werden soll, sollte stattdessen ein benanntes Volume oder eine SMB-Mount verwendet werden.

Hinweis

Das Binden der Bereitstellung direkt auf freigegebenen Clustervolumes (CSV) wird nicht unterstützt, virtuelle Computer, die als Containerhost fungieren, können auf einem CSV-Volume ausgeführt werden.

Erlaubnisse

Das berechtigungsmodell, das zum Binden von Bereitstellungen verwendet wird, variiert je nach Isolationsstufe für Ihren Container.

Container, dieHyper-V Isolation verwenden, verwenden ein einfaches schreibgeschütztes oder schreibgeschütztes Berechtigungsmodell. Auf Dateien wird über das LocalSystem Konto auf dem Host zugegriffen. Wenn Der Zugriff im Container verweigert wird, stellen Sie sicher, dass LocalSystem der Zugriff auf dieses Verzeichnis auf dem Host vorhanden ist. Wenn das schreibgeschützte Flag verwendet wird, werden änderungen, die am Volume innerhalb des Containers vorgenommen wurden, nicht sichtbar oder im Verzeichnis auf dem Host gespeichert.

Windows-Container mit Prozessisolation unterscheiden sich geringfügig, da sie die Prozessidentität innerhalb des Containers verwenden, um auf Daten zuzugreifen, was bedeutet, dass Datei-ACLs berücksichtigt werden. Die Identität des prozesses, der im Container ausgeführt wird ("ContainerAdministrator" unter Windows Server Core und "ContainerUser" auf Nano Server-Containern, standardmäßig), wird verwendet, um auf die Dateien und Verzeichnisse im bereitgestellten Volume anstatt LocalSystemauf das bereitgestellte Volume zuzugreifen, und muss Zugriff auf die Verwendung der Daten gewährt werden.

Da diese Identitäten nur im Kontext des Containers vorhanden sind - nicht auf dem Host, auf dem die Dateien gespeichert sind - sollten Sie eine bekannte Sicherheitsgruppe verwenden, z Authenticated Users . B. beim Konfigurieren der ACLs, um Zugriff auf die Container zu gewähren.

Warnung

Binden Sie keine vertraulichen Verzeichnisse wie z C:\ . B. in einen nicht vertrauenswürdigen Container. Dies würde es ermöglichen, Dateien auf dem Host zu ändern, auf die sie normalerweise keinen Zugriff haben und eine Sicherheitsverletzung erstellen könnte.

Beispielverwendung:

  • docker run -v c:\ContainerData:c:\data:RO für schreibgeschützten Zugriff
  • docker run -v c:\ContainerData:c:\data:RW für Lese-/Schreibzugriff
  • docker run -v c:\ContainerData:c:\data für Lese-/Schreibzugriff (Standard)

Symlinks werden im Container aufgelöst. Wenn Sie einen Hostpfad an einen Container binden, der ein Symlink ist oder Symlinks enthält, kann der Container nicht darauf zugreifen.

SMB-Bereitstellungen

Unter Windows Server, Version 1709 und höher, ermöglicht das Feature "SMB Global Mapping" das Bereitstellen einer SMB-Freigabe auf dem Host und das Übergeben von Verzeichnissen für diese Freigabe in einen Container. Der Container muss nicht mit einem bestimmten Server, einer bestimmten Freigabe, einem Benutzernamen oder einem Kennwort konfiguriert werden– das wird stattdessen auf dem Host behandelt. Der Container funktioniert genauso wie bei lokalem Speicher.

Konfigurationsschritte

  1. Ordnen Sie auf dem Containerhost die Remote-SMB-Freigabe global zu:

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

    Dieser Befehl verwendet die Anmeldeinformationen, um sich beim Remote-SMB-Server zu authentifizieren. Ordnen Sie anschließend den Pfad für die Remotefreigabe auf G: Laufwerkbuchstabe zu (dies kann jeder verfügbare Laufwerkbuchstabe sein). Auf diesem Containerhost erstellte Container können nun ihre Datenvolumes einem Pfad auf dem Laufwerk G: zugeordnet sein.

    Hinweis

    Wenn die globale Zuordnung in SMB für Container verwendet wird, können alle Benutzer auf dem Containerhost auf die Remotefreigabe zugreifen. Jede Anwendung, die auf dem Containerhost ausgeführt wird, hat auch Zugriff auf die zugeordnete Remotefreigabe.

  2. Erstellen von Containern mit Datenvolumes, die global bereitgestellten SMB-Freigabe-Docker zugeordnet sind, führen Sie -it Demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe

    Innerhalb des Containers wird c:\AppData1 dann dem Verzeichnis "ContainerData" der Remotefreigabe zugeordnet. Alle auf der global zugeordneten Remotefreigabe gespeicherten Daten sind für Anwendungen innerhalb des Containers verfügbar. Mehrere Container können Lese-/Schreibzugriff auf diese freigegebenen Daten mit demselben Befehl erhalten.

Diese globale SMB-Zuordnungsunterstützung ist SMB-clientseitiges Feature, das auf jedem kompatiblen SMB-Server funktionieren kann, einschließlich:

  • Scaleout File Server über Direkte Speicherplätze (S2D) oder ein herkömmliches SAN
  • Azure Files (SMB-Freigabe)
  • Herkömmlicher Dateiserver
  • Implementierung des SMB-Protokolls von Drittanbietern (z. B. NAS-Appliances)

Hinweis

Die globale SMB-Zuordnung unterstützt keine DFS-Namespaces (DFSN)-Ordner. Wenn Sie beispielsweise eine DFSN-Stammfreigabe New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1'zuordnen, gibt das Lesen der Ordnerziele dieses Stamms den Fehler "Der Netzwerkspeicherort kann nicht erreicht werden" zurück.

Benannte Volumes

Mit benannten Volumes können Sie ein Volume mit einem Namen erstellen, es einem Container zuweisen und später mit demselben Namen wiederverwenden. Sie müssen nicht den tatsächlichen Pfad nachverfolgen, an dem er erstellt wurde, nur den Namen. Das Docker-Modul unter Windows verfügt über ein integriertes benanntes Volume-Plug-In, das Volumes auf dem lokalen Computer erstellen kann. Ein zusätzliches Plug-In ist erforderlich, wenn Sie benannte Volumes auf mehreren Computern verwenden möchten.

Beispielschritte:

  1. docker volume create unwound - Erstellen eines Volumes mit dem Namen "Entwunden"
  2. docker run -v unwound:c:\data microsoft/windowsservercore - Starten eines Containers mit dem Volume, das c:\data zugeordnet ist
  3. Schreiben Sie einige Dateien in "c:\data" im Container, und beenden Sie den Container.
  4. docker run -v unwound:c:\data microsoft/windowsservercore - Starten eines neuen Containers
  5. Im neuen Container ausführen dir c:\data – die Dateien sind noch vorhanden

Hinweis

Windows Server konvertiert Zielpfadnamen (den Pfad innerhalb des Containers) in Kleinbuchstaben. d. h. -v unwound:c:\MyDatain -v unwound:/app/MyData Linux-Containern führt dazu, dass ein Verzeichnis innerhalb des Containers von c:\mydataoder /app/mydata in Linux-Containern zugeordnet wird (und erstellt wird, sofern nicht vorhanden).