Compute Engine 上のコンテナ


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

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

コンテナ環境とコンテナのオーケストレーション ツールを完全に制御する必要がある場合は、Compute Engine 上でコンテナを実行します。

また、Google Kubernetes Engine(GKE)を使用して、クラスタ管理とコンテナ オーケストレーションのタスクを簡素化することもできます。この場合、基盤となる VM インスタンスを管理する必要はありません。GKE では、Google のインフラストラクチャを使用して、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを行えるマネージド環境が提供されます。

GKE 環境は複数のマシン(具体的には Compute Engine インスタンス)で構成され、これらのマシンがグループ化されてクラスタを形成します。GKE クラスタを実行すると、負荷分散、ノードプール、ノードの自動修復、自動スケーリングとアップグレード、Google Cloud によるロギングとモニタリングなどの高度なクラスタ管理機能のメリットを活用できます。

Microsoft Windows Server を実行するノードプールを持つ GKE クラスタを作成する方法を学習します。

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオで Compute Engine のパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

Compute Engine の無料トライアル

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

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

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

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

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

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

  • Google の Container-Optimized OS
    • 付属: Docker、Kubernetes
    • イメージ プロジェクト: cos-cloud
    • イメージ ファミリー: cos-stable
  • Fedora CoreOS
    • 付属: Podman、Docker
    • イメージ プロジェクト: fedora-coreos-cloud
    • イメージ ファミリー: fedora-coreos-stable
  • Ubuntu
    • 付属: LXD
    • イメージ プロジェクト: ubuntu-os-cloud
    • イメージ ファミリー: ubuntu-2004-lts
  • Windows
    • 付属: Docker
    • イメージ プロジェクト: windows-cloud
    • イメージ ファミリー: windows-2019-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 2019 以降の公開イメージを使用して Windows Server インスタンスを作成します。最適なコンテナ サポートのため、最新の LTSC バージョンの Windows Server を使用することをおすすめします。LTSC の詳細については、Windows Server サービス チャネルをご覧ください。

Docker のインストール

Windows に Docker をインストールします。詳細については、コンテナ用に Windows を準備するをご覧ください。インストールが完了したら、インスタンスを再起動します。

追加の設定手順

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

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

Docker のデフォルトのネットワーク MTU は 1,500 バイトです。VPC ネットワーク MTU も 1,500 バイトに構成した場合は、このセクションの残りの部分は無視できます。ただし、ネットワークでデフォルトの VPC MTU/1,460 バイトを使用している場合は、インスタンスごとに追加の構成を行う必要があります。

各インスタンスの 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)

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

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

Windows コンテナを実行する

Windows コンテナを使い始めるにあたり、利用可能なリソースが多数用意されています。

  • Compute Engine での Windows コンテナの実行 Codelab では、Compute Engine 上の Windows コンテナについての概要情報を紹介しています。
  • Microsoft には、豊富な Windows コンテナ ドキュメントが用意されています。
  • Docker Hub は、Windows コンテナを格納、pull するためのリポジトリとして使用できます。

Windows コンテナの既知の問題

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

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

PS C:\> docker run -it mcr.microsoft.com/windows/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 コンテナーのバージョンの互換性ページで詳細情報を確認できます。Windows コンテナ バージョンの非互換性の問題を回避するには、コンテナを pull して実行するときに、ご使用の Windows バージョンに対応するタグを指定してください。たとえば、Windows Server バージョン 20H2 のインスタンスでは、次のコマンドを使用して、デフォルトの 2019 LTSC(1809)コンテナではなく、バージョン 20H2 の nanoserver コンテナでコマンド プロンプトを実行します。

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

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

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

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

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

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

こうした制限に対して推奨される回避策では、インスタンスのネットワーク インターフェースの MTU1460 に設定する手順とコンテナ ネットワーク インターフェースの MTU1460 に設定する手順の 2 つが必要です。また、VPC の MTU1500 に設定することもできますが、すべての VM を停止または移行する必要があります。

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

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

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

次のステップ