Compute Engine 上のコンテナ

ソフトウェア コンテナは、複数の分離したユーザースペース インスタンスで手軽にアプリを実行する方法です。コンテナは、Linux または Windows Server の公開 VM イメージ、あるいは Container-Optimized OS イメージで実行できます。コンテナにより、アプリをより少ない依存関係でホスト仮想マシン上で実行したり、同じ仮想マシン インスタンスにデプロイする他のコンテナ化されたアプリとは別に実行したりできます。このような特性によって、コンテナ化されたアプリがさらにポータブルになり、デプロイや大規模な保守をより簡単に行うことができます。

このドキュメントでは Compute Engine インスタンス上でコンテナを実行するための一般的なコンテナ テクノロジーをいくつか説明します。これらのテクノロジーは、Compute Engine が提供するほとんどの公開 VM イメージで使用できます。

コンテナ環境とコンテナのオーケストレーション ツールを完全に制御する必要がある場合は、Compute Engine 上でコンテナを実行します。また、Google Kubernetes Engine を使用して、クラスタ管理とコンテナ オーケストレーションのタスクを簡素化することもできます。この場合、基盤となる仮想マシン インスタンスを管理する必要はありません。

Compute Engine で実行されるコンテナ テクノロジー

一般的に、Compute Engine インスタンスはほぼすべてのコンテナ テクノロジーやツールを実行できます。最新の Linux オペレーティング システムでは、さまざまな種類のコンテナを実行できます。また、Windows Server 2016 以降で Docker を実行することもできます。コンテナ化されたアプリの実行と管理に使用できる一般的なツールは次のとおりです。

  • Dockerrkt の 2 つはよく使用されるコンテナ テクノロジーです。これらを使用すると、コンテナ化されたアプリを簡単に実行できます。
  • Kubernetes はコンテナ オーケストレーション プラットフォームです。これを使用すると、複数のインスタンス間またはハイブリッドクラウド環境内で実行コンテナの管理とスケーリングを行うことができます。
  • Compute Engine のコンテナは、Compute Engine VM インスタンスやマネージド インスタンス グループにコンテナを簡単にデプロイする手段となります。
  • 既存のシステムを LXD イメージに変換して Compute Engine 仮想マシン インスタンス内で実行すれば、シンプルなリフトアンドシフトの移行ソリューションになります。LXD は Ubuntu イメージで稼働します。

また、Container Registry を使用して、コンテナ イメージのバージョンを管理できます。Container Registry は、コンテナ イメージを Compute Engine の Kubernetes に、または Google Kubernetes Engine クラスタにデプロイする前に、それらのイメージを 1 か所でまとめて保存し、管理する場所として機能します。

コンテナが最適化された VM イメージ

Compute Engine では、インスタンスの作成とコンテナ ワークロードの実行に使用できる複数の公開 VM イメージが提供されています。一部の公開 VM イメージには、最小限のコンテナ用に最適化されたオペレーティング システムがあり、それには Docker、rkt、Kubernetes の最新バージョンがプリインストールされています。次の公開イメージ ファミリーは、特にコンテナを実行するために設計されたものです。

  • Google の Container-Optimized OS
    • 付属: Docker、Kubernetes
    • イメージ プロジェクト: cos-cloud
    • イメージ ファミリー: cos-stable
  • CoreOS
    • 付属: Docker、rkt、Kubernetes
    • イメージ プロジェクト: coreos-cloud
    • イメージ ファミリー: coreos-stable
  • Ubuntu
    • 付属: LXD
    • イメージ プロジェクト: ubuntu-os-cloud
    • イメージ ファミリー: ubuntu-1604-lts
  • Windows
    • 付属: Docker
    • イメージ プロジェクト: windows-cloud
    • イメージ ファミリー: windows-1809-core-for-containers

デフォルトで付属していない特定のコンテナツールやテクノロジーを実行する必要がある場合は、これらのテクノロジーを手動でインストールしてください。

インスタンスにコンテナ テクノロジーをインストールする

インスタンスで単一のコンテナを起動するには、インスタンスを作成するときにコンテナ イメージを指定します。Compute Engine では、Docker がインストールされた最新の Container-Optimized OS イメージが自動的に提供され、VM の起動時にコンテナが起動します。詳しくは、VM へのコンテナのデプロイをご覧ください。

また、必要なコンテナ テクノロジーやオーケストレーション ツールを使用して、Compute Engine でコンテナ ワークロードを実行することもできます。公開 VM イメージからインスタンスを作成した後で、必要なコンテナ テクノロジーをインストールできます。例:

一部の状況では、これらのテクノロジーが連携して正しく動作するために、特定のバージョンが必要になる場合があります。たとえば、Kubernetes は通常、Docker の特定のバージョンで最適に実行されます。通常、これらのテクノロジーの最新バージョンをインストールすると、最善の結果が得られます。

Windows Server イメージに Docker をインストールする

Windows Server 2016 以降のバージョンには、コンテナ サポートが含まれています。Docker コンテナを Windows Server インスタンス上で実行する予定の場合は、Windows Server for Containers 公開イメージから開始することをおすすめします。このイメージには、次のコンポーネントがインストールされています。

Windows Server for Containers イメージを使用するのではなく、Windows Server ベースイメージに Docker をインストールし、コンテナ化されたアプリを実行する場合は、次に説明する手順に従います。

まず、Windows Server 2016 以降の公開イメージを使用して Windows Server インスタンスを作成します。最適なコンテナ サポートのために、最新の Windows Server の半年ごとのリリース(Windows Server バージョン 1809 など)を使用することをおすすめします。

Docker のインストール

  1. Windows インスタンスに接続します。

  2. 管理者として PowerShell ターミナルを開きます。

  3. 次のようにして Microsoft リポジトリから Docker をインストールします。

        PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
        
        PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
        
  4. Compute Engine の Windows コンテナに存在する既知の問題を回避するため、次のコマンドを実行します。

    • Receive Segment Coalescing を無効にします。

          PS C:\> netsh netkvm setparam 0 *RscIPv4 0
          
    • IPv6 を有効にします。

          PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
          /v DisabledComponents /t REG_DWORD /d 0x0 /f
          
  5. 次のようにしてインスタンスを再起動します。

        PS C:\> Restart-Computer -Force
        

追加の設定手順

この状態でも Docker を使用してインスタンス内でコンテナを実行できます。たとえば、次のコマンドは Windows nanoserver コンテナ イメージをダウンロードし、nanoserver コンテナ内でコマンド プロンプトを実行します。

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

Docker のデフォルト ネットワーク MTU には、インスタンスへの接続とコンテナからインターネットへの接続に影響する既知の問題があります。この問題を回避するには、まずインスタンスの PowerShell ターミナルで次のコマンドを実行して、すべてのネットワーク インターフェース(イーサネットと vEthernet の両方)の MTU を 1460 に設定します。

    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)
    

コンテナのネットワーク インターフェースもデフォルトで MTU 1500 を使用するため、インスタンスの MTU を修正しても、コンテナからインターネットへの接続が不安定になる場合があります。すべてのコンテナに対して MTU を正しく設定するためのコマンドについては、コンテナの MTU をご覧ください。

Docker ネットワークを構成するたびに MTU コマンドの実行が必要になる場合があります。詳細については、既知の問題をご覧ください。

Windows コンテナを実行する

Windows コンテナを使い始める際は多様なリソースを利用できます。

Windows コンテナの既知の問題

Windows バージョン間でコンテナの互換性がない

古いバージョンの Windows で構築されたコンテナは、新しいバージョンの Windows を実行する Compute Engine インスタンスでは機能しません。Docker はデフォルトでは Windows Server 2016 バージョンのコンテナを pull します。つまり、Windows Server バージョン 1709 以降を実行しているインスタンスで次のコマンドを実行すると、エラーが発生します。

    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)
    

Microsoft の Windows container version compatibility ページで詳細情報を確認できます。Windows コンテナ バージョンの非互換性の問題を回避するには、コンテナを pull して実行するときに、ご使用の Windows バージョンに対応するタグを指定してください。たとえば、Windows Server バージョン 1809 のインスタンスでは、次のコマンドを使用して、デフォルトの 2016 コンテナではなく、バージョン 1809 の nanoserver コンテナでコマンド プロンプトを実行します。

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

MTU に互換性の問題があり、インスタンスとコンテナの接続が不安定になる

docker network create コマンドまたは New-VMSwitch コマンドを使用して Windows インスタンスにコンテナ ネットワークを作成すると、インスタンスのネットワーク インターフェースの MTU は通常、強制的に 1500 に設定されます。新しい Docker コンテナ内のデフォルトのネットワーク インターフェースも通常は MTU 1500 を使用します。Google Cloud では MTU 1460 のみがサポートされるため、MTU が強制的に 1500 に設定されると、次のような問題が発生する可能性があります。

  • RDP セッションが停止し、再接続が不能になる。この問題は、透過的なコンテナ ネットワークを作成すると発生します。

  • コンテナ内の DNS 解決に失敗する。

  • DNS の解決は成功するが、コンテナからインターネットへの HTTP 接続は失敗する。

こうした制限を回避するには、インスタンスのネットワーク インターフェースの MTU の設定コンテナ ネットワーク インターフェースの MTU の設定の 2 つの手順が必要です。

1. Windows インスタンスのネットワーク インターフェースの MTU を設定する

Windows インスタンスの PowerShell ターミナルで次のコマンドを実行して、すべてのネットワーク インターフェース(イーサネットと vEthernet の両方)の MTU を設定します。

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

次のコマンドを使用して、インスタンスのイーサネットと vEthernet のインターフェースの MTU が 1460 に設定されていることを確認します。

    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)
    

RDP を介してインスタンスに接続できなくなったことが原因でこれらのコマンドを実行できない場合には、シリアル コンソールからインスタンスに接続して、cmd プロンプトを開始し、そこで netsh コマンドを実行して MTU を修復します。この作業を行わなくても済むように、同じく MTU 修復コマンドを実行するスクリプトの一部として docker network ... または New-VMSwitch コマンドを実行することをおすすめします。

2. Windows コンテナ ネットワーク インターフェースの MTU を設定する

Windows コンテナの MTU は、コンテナの実行中に、コンテナの内部またはコンテナをホストしているインスタンスから設定する必要があります。コンテナで PowerShell を利用可能な場合は、MTU を正しく設定するために、このコマンドをインタラクティブに、またはコンテナ内のスクリプトから実行できます。

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

あるいは、Windows インスタンスでこのコマンドを実行して、実行中のすべてのコンテナに対して MTU を設定することもできます。

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

Docker コンテナが起動しない

docker run を使用してコンテナを起動すると、次のエラーで失敗することがあります。

    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)
    

この問題は、Windows Update KB4015217 が適用された Windows Server 2016 インスタンスで発生します。この問題を回避するには、次の PowerShell コマンドを使用してインスタンスで IPv6 を有効にします。

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

IPv6 を有効にしたら、インスタンスを再起動します。

    PS C:\> Restart-Computer -Force
    

この問題が今後のオペレーティング システムで修正された場合には、元の IPv6 設定に戻すことができます。

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

Hyper-V コンテナが起動しない

現時点では、Hyper-V コンテナは Compute Engine でサポートされていません。

次のステップ