Compute Engine 上のコンテナ

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

このドキュメントでは Compute Engine インスタンス上でコンテナを実行するための一般的なコンテナ テクノロジーをいくつか説明します。これらのテクノロジーは、Google 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 Container Engine クラスタにデプロイする前に、それらのイメージを 1 か所でまとめて保存し、管理する場所として機能します。

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

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

  • Google のコンテナ用に最適化された 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-1803-core-for-containers

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

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

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

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

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

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

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

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

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

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 microsoft/nanoserver:1803 cmd.exe

ただし、Docker のデフォルト ネットワークの MTU に既知の問題が存在し、インスタンスとの接続やコンテナからインターネットへの接続で問題が発生します。この問題を回避するため、インスタンスの PowerShell ターミナルで次のコマンドを実行してインスタンス名を表示し、vEthernet MTU を 1460 に設定します。

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (nat)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (nat)" mtu=1460 store=persistent

コンテナのネットワーク インターフェースがデフォルトで MTU 1500 を使用するため、インスタンスの MTU を修正しても、コンテナからインターネットへの接続が不安定になる場合があります。安定した接続を確立するには、コンテナの内部でも同じ MTU コマンド(インターフェース名は異なります)を実行します。新しいコンテナ イメージを生成した場合に、この方法で MTU を修正してください。

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

Windows コンテナを実行する

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

Windows コンテナの既知の問題

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

古いバージョンの Windows で構築されたコンテナは、新しいバージョンの Windows を実行する Compute Engine インスタンスでは機能しません。Docker はデフォルトでは Windows Server 2016 バージョンのコンテナを取得します。つまり、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 コンテナ バージョンの非互換性の問題を回避するには、コンテナを取得して実行するときに、ご使用の Windows バージョンに対応するタグを指定してください。たとえば Windows Server バージョン 1709 のインスタンスは次のコマンドを使用して、デフォルトの 2016 コンテナの代わりにバージョン 1709 の nanoserver コンテナでコマンド プロンプトを実行します。

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

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

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

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

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

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

この状況から復旧するには、インスタンスまたはコンテナの PowerShell ターミナルで次のコマンドを実行して、インターフェース名を確認し、MTU をリセットします。

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (HNSTransparent)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (HNSTransparent)" mtu=1460 store=persistent

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

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 でサポートされていません。

次のステップ

  • コンテナ アプリケーションの実行に使用できるインスタンスを作成し起動する
  • Compute Engine インスタンスについて詳しく知る
  • Google Kubernetes Engine について詳しく知る。Google Kubernetes Engine を使用すると、Google Cloud Platform 上でコンテナを簡単に実行できます。この場合、Compute Engine インスタンスを自分で管理する必要はありません。
  • Kubernetes について詳しく知る
  • Container Registry の使い方を知る。コンテナ イメージを公開せずに Google Cloud Platform 内に保存する方法を紹介します。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント