Container in Compute Engine

Softwarecontainer bieten eine bequeme Möglichkeit, Ihre Anwendungen in mehreren isolierten User-Space-Instanzen auszuführen. Sie können Container auf öffentlichen Linux- oder Windows Server-VM-Images oder auf einem Container-Optimized OS-Image ausführen. Mit Containern werden Ihre Anwendungen mit weniger Abhängigkeiten auf der Host-VM ausgeführt und sie sind unabhängig von anderen Containeranwendungen, die Sie auf der gleichen VM-Instanz bereitstellen. Diese Eigenschaften machen Containeranwendungen portabler, einfacher zu implementieren und wartungsfreundlicher in jedem erforderlichen Maßstab.

Dieses Dokument beschreibt einige der gebräuchlicheren Containertechnologien, die Sie anwenden können, um Container auf Compute Engine-Instanzen auszuführen. Sie können diese Technologien auf den meisten öffentlichen VM-Images verwenden, die Google Compute Engine bietet.

Führen Sie Container auf Compute Engine aus, wenn Sie die vollständige Kontrolle über Ihre Containerumgebung und Ihre Tools zur Containerorchestrierung benötigen. Alternativ können Sie Google Kubernetes Engine verwenden, um Aufgaben der Clusterverwaltung und Containerorchestrierung so zu vereinfachen, dass Sie die zugrunde liegenden VM-Instanzen nicht verwalten müssen.

Containertechnologien, die auf Compute Engine laufen

Im Allgemeinen können Compute Engine-Instanzen fast jede Containertechnologie oder fast jedes Containertool ausführen. Unter modernen Linux-Betriebssystemen können Sie verschiedene Containertypen ausführen. Außerdem haben Sie die Möglichkeit, Docker unter Windows Server 2016 oder höher auszuführen. Die folgende Liste enthält gängige Tools, die Sie zum Ausführen und Verwalten von Containeranwendungen verwenden können:

  • Docker und rkt sind zwei beliebte Containertechnologien, mit denen sich Containeranwendungen einfach ausführen lassen.
  • Kubernetes ist eine Containerorchestrierungsplattform, mit der Sie Ihre ausgeführten Container auf mehreren Instanzen oder in einer Hybrid-Cloudumgebung verwalten und skalieren können.
  • Container in Compute Engine bieten eine einfache Möglichkeit, Container auf VM-Instanzen von Compute Engine oder in verwalteten Instanzgruppen bereitzustellen.
  • Sie können Ihre bestehenden Systeme in LXD-Images konvertieren und sie auf VM-Instanzen von Compute Engine als eine einfache "Lift-and-Shift"-Migrationslösung ausführen. LXD lässt sich auf Ubuntu-Images ausführen.

Darüber hinaus können Sie Container Registry zum Verwalten der Image-Versionen der Container verwenden. Container Registry ermöglicht das zentrale Speichern und Verwalten von Container-Images, bevor Sie diese für Kubernetes in Compute Engine oder für Google Kubernetes Engine-Cluster bereitstellen.

Container-optimierte VM-Images

Compute Engine bietet mehrere öffentliche VM-Images, die Sie zum Erstellen von Instanzen und zum Ausführen Ihrer Container-Workloads verwenden können. Einige dieser öffentlichen VM-Images haben ein minimalistisches, Container-optimiertes Betriebssystem, das neuere, vorinstallierte Versionen von Docker, rkt oder Kubernetes enthält. Die folgenden öffentlichen Image-Familien wurden speziell entwickelt, um Container laufen zu lassen:

  • Container-optimiertes OS von Google
    • Enthält: Docker, Kubernetes
    • Image-Projekt: cos-cloud
    • Image-Familie: cos-stable
  • CoreOS
    • Enthält: Docker, rkt, Kubernetes
    • Image-Projekt: coreos-cloud
    • Image-Familie: coreos-stable
  • Ubuntu
    • Enthält: LXD
    • Image-Projekt: ubuntu-os-cloud
    • Image-Familie: ubuntu-1604-lts
  • Windows
    • Enthält: Docker
    • Image-Projekt: windows-cloud
    • Image-Familie: windows-1809-core-for-containers

Wenn Sie bestimmte Containertools und -technologien auf Images laufen lassen müssen, die sie nicht standardmäßig enthalten, installieren Sie diese Technologien manuell.

Containertechnologien auf meinen Instanzen installieren

Wenn Sie einen einzelnen Container in einer Instanz starten möchten, geben Sie beim Erstellen einer Instanz ein Container-Image an. Compute Engine stellt automatisch ein aktuelles Image eines Container-Optimized OS mit installiertem Docker bereit und startet den Container zusammen mit der VM. Weitere Informationen dazu finden Sie unter Container auf VMs bereitstellen.

Alternativ können Sie Ihre Container-Workloads mit den gewünschten Containertechnologien und Orchestrierungstools auf Compute Engine ausführen. Sie können ein öffentliches VM-Image zum Erstellen einer Instanz verwenden und dann die gewünschten Containertechnologien installieren. Beispiel:

In einigen Situationen können für eine funktionierende Zusammenarbeit bestimmte Versionen dieser Technologien erforderlich sein. Kubernetes zum Beispiel läuft in der Regel am besten mit bestimmten Versionen von Docker. Normalerweise können Sie die neuesten Versionen dieser Technologien installieren, um ein bestmögliches Ergebnis zu erhalten.

Docker auf Windows Server-Images installieren

Windows Server 2016 und spätere Versionen bieten Containerunterstützung. Wenn Sie vorhaben, Docker-Container auf einer Windows Server-Instanz auszuführen, empfiehlt Google, mit dem öffentlichen Image von Windows Server für Container zu beginnen. In diesem Image sind folgende Komponenten installiert:

Wenn Sie Docker auf dem Basis-Image von Windows Server installieren und Containeranwendungen ausführen möchten, anstatt das Image von Windows Server für Container zu verwenden, gehen Sie folgendermaßen vor.

Erstellen Sie zuerst eine Windows Server-Instanz. Dazu können Sie ein öffentliches Image von Windows Server 2016 oder einer höheren Version verwenden. Für die beste Containerunterstützung empfiehlt Google die Verwendung des neuesten halbjährlichen Release von Windows Server, wie Windows Server Version 1809.

Docker installieren

  1. Stellen Sie eine Verbindung zur Windows-Instanz her.

  2. Öffnen Sie ein PowerShell-Terminal als Administrator.

  3. Installieren Sie Docker über die Microsoft-Repositories:

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    
    PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
    
  4. Führen Sie die folgenden Befehle aus, um bekannte Probleme mit Windows-Containern auf Compute Engine zu umgehen:

    • Empfangssegmentzusammenfügung deaktivieren:

      PS C:\> netsh netkvm setparam 0 *RscIPv4 0
      
    • IPv6 aktivieren:

      PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
      /v DisabledComponents /t REG_DWORD /d 0x0 /f
      
  5. Starten Sie die Instanz neu:

    PS C:\> Restart-Computer -Force
    

Weitere Einrichtungsschritte

Jetzt können Sie Docker verwenden, um Container in der Instanz auszuführen. Mit dem folgenden Befehl laden Sie zum Beispiel das Windows-Container-Image nanoserver herunter und führen eine Eingabeaufforderung in einem nanoserver-Container aus:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

Beachten Sie, dass bei der Standard-Netzwerk-MTU von Docker ein bekanntes Problem vorliegt, das die Konnektivität zur Instanz und die Konnektivität von Containern zum Internet beeinträchtigt. Führen Sie zum Umgehen des Problems zuerst die folgenden Befehle in einem PowerShell-Terminal auf der Instanz aus, um die MTU für alle Netzwerkschnittstellen (sowohl Ethernet als auch vEthernet) auf 1460 festzulegen:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

Auch nach der Korrektur der Instanz-MTU kann die Verbindung der Container zum Internet instabil sein, da die Netzwerkschnittstelle des Containers standardmäßig eine MTU von 1500 verwendet. Lesen Sie den Abschnitt Container-MTU, um mehr über Befehle zum richtigen Einstellen der MTU für jeden Container zu erfahren.

Unter Umständen müssen Sie bei der Docker-Netzwerkkonfiguration diese MTU-Befehle in regelmäßigen Abständen wieder ausführen. Weitere Informationen finden Sie im Abschnitt mit bekannten Problemen.

Windows-Container ausführen

Es ist eine Vielzahl von Ressourcen für die ersten Schritte mit Windows-Containern verfügbar:

Bekannte Probleme mit Windows-Containern

Container können nicht in beliebigen Windows-Versionen verwendet werden

Container, die auf älteren Windows-Versionen basieren, funktionieren nicht in Compute Engine-Instanzen, auf denen neuere Versionen von Windows ausgeführt werden. Die Windows Server 2016-Version eines Containers wird von Docker standardmäßig abgerufen. Das bedeutet, dass beim Ausführen des folgenden Befehls in einer Instanz unter Windows Server Version 1709 oder höher ein Fehler ausgegeben wird:

PS C:\> docker run -it microsoft/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

Auf Microsofts Seite zur Versionskompatibilität von Windows-Containern finden Sie weitere Informationen. Geben Sie beim Abrufen und Ausführen von Containern unbedingt das Flag für die verwendete Windows-Version an, um Versionsinkompatibilitäten mit Windows-Containern zu umgehen. Verwenden Sie in einer Instanz mit Windows Server Version 1809 zum Beispiel den folgenden Befehl, um eine Eingabeaufforderung im nanoserver-Container der Version 1809 auszuführen, statt im standardmäßigen 2016-Container:

PS C:\> docker run -it microsoft/nanoserver:1809 cmd.exe

MTU-Inkompatibilitäten wirken sich auf die Instanz- und Containerkonnektivität aus

Wenn Sie mit dem Befehl docker network create oder New-VMSwitch ein Containernetzwerk auf einer Windows-Instanz erstellen, wird die MTU der Instanznetzwerkschnittstelle üblicherweise auf 1500 gesetzt. Die Standardnetzwerkschnittstelle innerhalb eines neuen Docker-Containers verwendet in der Regel auch eine MTU von 1500. Die Google Cloud Platform unterstützt nur eine MTU von 1460. Wenn die MTU also auf 1500 gesetzt wird, können die folgenden Probleme auftreten:

  • Die RDP-Sitzung kann beendet werden und Sie können möglicherweise die Verbindung nicht wiederherstellen. Dies geschieht, wenn ein transparentes Containernetzwerk erstellt wird.

  • Die DNS-Auflösung im Container kann fehlschlagen.

  • Die DNS-Auflösung ist zwar erfolgreich, es lässt sich jedoch keine HTTP-Verbindung vom Container zum Internet herstellen.

Das Umgehen dieser Einschränkungen erfordert zwei Schritte: das Festlegen der MTU für die Netzwerkschnittstellen der Instanz und das Festlegen der MTU für die Containernetzwerkschnittstellen.

1. MTU für die Netzwerkschnittstellen der Windows-Instanz festlegen

Führen Sie den folgenden Befehl in einem PowerShell-Terminal auf der Windows-Instanz aus, um die MTU für alle Netzwerkschnittstellen (sowohl Ethernet als auch vEthernet) festzulegen:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

Überprüfen Sie mit dem folgenden Befehl, ob die MTUs der Ethernet- und vEthernet-Schnittstelle der Instanz auf 1460 eingestellt sind:

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

Wenn Sie diese Befehle nicht ausführen können, weil Sie über RDP keine Verbindung mehr zu einer Instanz herstellen können, können Sie über die serielle Konsole eine Verbindung zur Instanz herstellen, eine cmd-Eingabeaufforderung starten und dort die netsh-Befehle ausführen, um die MTU zu reparieren. Um dies zu vermeiden, empfehlen wir, docker network ...- oder New-VMSwitch-Befehle als Teil eines Skripts auszuführen, das auch den MTU-Reparaturbefehl ausführt.

2. MTU für die Windows-Container-Netzwerkschnittstellen festlegen

Die MTU für einen Windows-Container muss festgelegt werden, während der Container ausgeführt wird, entweder innerhalb des Containers oder auf der Instanz, die den Container hostet. Wenn PowerShell in Ihrem Container verfügbar ist, können Sie diesen Befehl interaktiv oder über ein Skript im Container ausführen, um die MTU korrekt festzulegen:

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

Sie können diesen Befehl auch auf der Windows-Instanz ausführen, um die MTU für alle ausgeführten Container festzulegen:

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

Docker-Container starten nicht

Das Starten eines Containers mit docker run kann fehlschlagen, wobei der folgende Fehler ausgegeben wird:

C:\Program Files\Docker\docker.exe: Error response from daemon: container ...
encountered an error during CreateContainer: failure in a Windows system call:
Element not found. (0x490)

Dieses Problem tritt auf Windows Server 2016-Instanzen mit Windows Update KB4015217 auf. Es lässt sich beheben, indem Sie mit dem folgenden PowerShell-Befehl IPv6 auf der Instanz aktivieren:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0x0 /f

Nachdem Sie IPv6 aktiviert haben, starten Sie die Instanz neu:

PS C:\> Restart-Computer -Force

Sobald das Problem in zukünftigen Betriebssystem-Updates behoben wird, können Sie die ursprüngliche IPv6-Einstellung wiederherstellen:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0xff /f

Hyper-V-Container starten nicht

Hyper-V-Container werden derzeit nicht von Compute Engine unterstützt.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation