コンテナを実行する際のオプションの構成


始める前に

  • コンテナについて理解を深めるために、Compute Engine のコンテナをご覧ください。
  • Docker について理解を深めるために、Docker のドキュメントをお読みください。
  • Compute Engine でのコンテナのデプロイをご覧ください。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.

VM と MIG にコンテナをデプロイする際に使用するインスタンスまたはインスタンス テンプレートを作成するときは、Google Cloud コンソールまたは Google Cloud CLI を使用してコンテナ構成を指定します。

ここでは、VM インスタンスのオプションの構成方法について説明しますが、以下のオプションはインスタンス テンプレートの作成時にも構成できます。Google Cloud コンソールまたは Google Cloud CLI を使用して、インスタンス テンプレート内の VM インスタンスのオプションを構成します。

コンソール

  1. [インスタンス テンプレートの作成] ページに移動します。

    [インスタンス テンプレートの作成] に移動

  2. [コンテナ] セクションで、[この VM インスタンスにコンテナ イメージをデプロイします] チェックボックスをオンにし、[コンテナの詳細オプション] を開きます。

gcloud

  1. Google Cloud CLI で、次の例に示すように gcloud compute instance-templates create-with-container コマンドを使用します。

再起動ポリシーの指定

再起動ポリシーを設定すると、終了時にコンテナを再起動するかどうかを指定できます。デフォルトのポリシーは、常に再起動することです。障害発生時に再起動するようにすることも、再起動は行わないようにすることもできます。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [再起動ポリシー] セクションで、コンテナの再起動ポリシーを選択します。
    3. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

コンテナに再起動ポリシーを指定するには、--container-restart-policy フラグを使用します。

  • always(デフォルト)
  • on-failure
  • never

次の例では、on-failure 再起動ポリシーを使用してコンテナを起動します。つまり、コンテナの終了コードがゼロでない場合にのみ再起動が行われます。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-restart-policy on-failure

VM 上で実行されているコンテナの再起動ポリシーを指定するには、--container-restart-policy フラグを指定して gcloud compute instances update-container コマンドを使用します。

特権モードでコンテナを実行する

特権モードでコンテナを実行すると、ホスト上のすべてのデバイスにアクセスできます。コンテナはデフォルトでは「非特権」として実行され、どのデバイスにもアクセスできません。

Console

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [権限のあるユーザーとして実行] を選択します。
    3. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

ランタイム権限のあるコンテナを実行するには、--container-privileged フラグを使用します。次の例では、特権モードで busybox コンテナを起動しています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-privileged

VM 上のコンテナを更新するには、--container-privileged フラグを指定して gcloud compute instances update-container コマンドを使用します。特権モードをオフにするには、--no-container-privileged フラグを使用します。

コンテナ ランタイムに STDIN のバッファを割り当てる

コンテナ ランタイムに STDIN のバッファを割り当てると、コンテナで STDIN ストリームを開いたまま維持できます。設定しない場合、コンテナでの STDIN からの読み取りが常に EOF になります。

コンテナ内で対話型シェルを設定する場合や、パイプからの標準入力をコンテナで受け取れるようにする場合は、疑似 TTY を割り当てると同時に、STDIN ストリームを開いたままにする必要があります。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [STDIN のバッファの割り当て] を選択します。
    3. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

コンテナ ランタイムに STDIN のバッファを割り当てるには、--container-stdin フラグを使用します。次の例では、コンテナを起動し、STDIN を開いたままにしています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-stdin

VM 上のコンテナを更新するには、--container-stdin フラグを指定して gcloud compute instances update-container コマンドを使用します。STDIN のバッファの割り当てをオフにするには、--no-container-stdin フラグを使用します。

疑似 TTY を割り当てる

コンテナに対話型シェルを設定するには、STDIN のバッファの割り当てに加え、コンテナの疑似 TTY の割り当てが必要です。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [疑似 TTY の割り当て] を選択します。
    3. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

疑似 TTY を割り当てるには、--container-tty フラグを使用します。次の例では、コンテナを起動し、疑似 TTY を割り当てています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-stdin \
  --container-tty

VM 上のコンテナを更新するには、--container-tty フラグを指定して gcloud compute instances update-container コマンドを使用します。疑似 TTY を割り当てるには、--no-container-tty フラグを使用します。

コンテナの起動時に実行するデフォルトのコマンドをオーバーライドする

コンテナ イメージの ENTRYPOINT では、コンテナの起動時に実行する実行可能ファイルを指定します。これによって、コンテナをその実行可能ファイルのバイナリであるかのように実行できます。

コンテナ イメージの ENTRYPOINT コマンドをオーバーライドできます。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [コマンド] フィールドに、パラメータなしで単一の実行可能コマンドを入力します(例: uptime)。
    3. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

コンテナ イメージの ENTRYPOINT をオーバーライドするには、--container-command フラグを使用します。次の例では、busybox で uptime コマンドを実行して、前回の起動からの経過時間を表示しています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-command "uptime"

VM 上のコンテナのコマンドを更新するには、--container-command フラグを指定して gcloud compute instances update-container コマンドを使用します。

更新したコンテナのデフォルトのコマンドをクリアするには、--clear-container-command フラグを指定して update-container コマンドを使用します。

コンテナの ENTRYPOINT コマンドに引数を渡す

コンテナの ENTRYPOINT コマンドに引数を渡す(追加する)ことも、デフォルトのコンテナの CMD コマンドをオーバーライドすることもできます。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [引数] セクションで [引数を追加] をクリックします。
    3. ボックスごとに 1 つのコマンド引数を入力します。
    4. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

コンテナ イメージの ENTRYPOINT コマンドに引数を渡すには、--container-arg フラグを使用します。各引数にそれぞれフラグを使用してください。

次の例では、busybox を自動的に実行するように設定されているコンテナで -c 'ls -l' 引数を指定した /bin/ash コマンドを実行しています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-command "/bin/ash" \
  --container-arg="-c" \
  --container-arg="ls -l"

VM 上で実行されているコンテナのコマンド引数を更新するには、--container-arg フラグを指定して gcloud compute instances update-container コマンドを使用します。この更新によって、引数リスト全体が新しいリストに置き換えられます。

コンテナ宣言からすべての引数を削除するには、--clear-container-args フラグを指定して update-container コマンドを使用します。

ログドライバ オプションの構成

ログドライバ オプションを構成する必要がある場合は、VM 起動スクリプトを作成し、必要なロギング オプションを使用して Docker 構成ファイルを更新できます。これらのオプションは、VM で実行され、ログドライバ オプションを指定しないすべてのコンテナに適用されます。

たとえば、次の起動スクリプトでは、コンテナのログサイズを制限するオプションなど、複数のオプションを設定してから、VM で Docker を再起動します。

cat <<EOF > /etc/docker/daemon.json
{
  "live-restore": true,
  "storage-driver": "overlay2",
  "log-opts": {
    "max-size": "10m"
  }
}
EOF
systemctl restart docker

環境変数の設定

コンテナで環境変数を設定できます。KEY が複数回繰り返されるときには、KEY の最後の値のみが取得されます。

Console

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [環境変数] セクションで、[変数を追加] をクリックします。
    3. 必要に応じて、1 行に 1 つずつ環境変数を追加または削除します。
    4. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

コンテナで環境変数を設定するには、--container-env フラグを使用します。次の例では、HOMEMODEOWNER の 3 つの環境変数を設定しています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-env HOME=/home,MODE=test,OWNER=admin

ローカル ファイルから環境変数を設定するには、--container-env-file フラグを使用します。次の例では、env.txt ファイルから 2 つの環境変数を設定しています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-env-file ./env.txt

env.txt ファイルの内容は次のとおりです。

# this is a comment
HOME=/home
MODE=test
OWNER=admin

VM 上のコンテナの環境変数を更新するには、--container-env フラグまたは --container-env-file フラグを指定して gcloud compute instances update-container コマンドを使用します。これによって、VM インスタンスのコンテナ宣言に含まれるすべての変数が更新されます。コンテナ宣言に含まれていない変数は追加されます。

VM 上のコンテナを更新するときに環境変数を削除するには、--remove-container-env フラグを使用します。次の例では、MODEOWNER という環境変数を削除しています。

gcloud compute instances update-container busybox-vm \
  --remove-container-env MODE,OWNER

指定した環境変数が存在しない場合には通知なく無視されます。

データ ボリュームとしてホスト ディレクトリをマウントする

ホスト VM からコンテナにディレクトリをマウントできます。

コンソール

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [ボリュームのマウント] セクションで、[ボリュームを追加] をクリックします。
    3. [ボリュームのタイプ] リストから、[ディレクトリ] を選択し、次の操作を行います。

      • [マウントパス] フィールドで、ホスト ディレクトリをマウントするコンテナ ディレクトリ構造にマウントパスを指定します。
      • [ホストのパス] フィールドに、マウントするホスト ディレクトリのホストパスを指定します。
      • [モード] リストで、ディレクトリを読み取り / 書き込みモードと読み取り専用モードのどちらでマウントするかを指定します。
    4. コンテナの詳細を確認するには、[選択] をクリックします。

  4. VM 作成プロセスを続行します。

gcloud

コンテナにホスト VM ディレクトリをマウントするには、--container-mount-host-path フラグを使用します。次の例では、ホスト ディレクトリ /tmp を、/logs にあるコンテナに読み取り / 書き込みモードでマウントしています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-mount-host-path mount-path=/logs,host-path=/tmp,mode=rw

読み取り専用モードでホスト ディレクトリをマウントするには、mode=ro を指定します。

コンテナのホスト ディレクトリのマウントを更新するには、--container-mount-host-path フラグを指定して gcloud compute instances update-container コマンドを使用します。指定したマウントパスに一致するボリューム マウントを削除するには、--remove-container-mounts フラグを使用します。次の例では、mount-path=/logs に一致するホストパス マウントを削除しています。

gcloud compute instances update-container busybox-vm \
  --remove-container-mounts /logs

指定したマウントパスが存在しない場合には通知なく無視されます。

データ ボリュームとして tmpfs ファイル システムをマウントする

空の tmpfs ファイル システムをコンテナにマウントできます。

Console

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [ボリュームのマウント] セクションで、[ボリュームを追加] をクリックします。
    3. [ボリュームのタイプ] リストから、[TmpFS] を選択します。
    4. [マウントパス] フィールドで、TmpFS ボリュームをマウントするコンテナ ディレクトリ構造にマウントパスを指定します。
    5. [モード] リストで、TmpFS ボリュームを読み取り / 書き込みモードと読み取り専用モードのどちらでマウントするかを指定します。
    6. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

空の tmpfs ファイル システムをコンテナにマウントするには、--container-mount-tmpfs フラグを使用します。次の例では、tmpfs ファイル システムを /cache にあるコンテナに読み取り / 書き込みモードでマウントしています。

gcloud compute instances create-with-container busybox-vm \
  --container-image docker.io/busybox:1.27 \
  --container-mount-tmpfs mount-path=/cache
 

コンテナの tmpfs マウントを更新するには、--container-mount-tmpfs フラグを指定して gcloud compute instances update-container コマンドを使用します。更新時に指定したマウントパスに一致する tmpfs マウントを削除するには、--remove-container-mounts フラグを使用します。次の例では、mount-path=/cache に一致する tmpfs マウントを削除しています。

gcloud compute instances update-container busybox-vm \
  --remove-container-mounts /cache

指定したマウントパスが存在しない場合には通知なく無視されます。

データ ボリュームとして永続ディスクをマウントする

Container-Optimized OS 69 以降では、ホスト VM からコンテナに永続ディスクをマウントできます。

前提条件

  • ディスクに ext4 ファイル システムがあるか、ファイル システムが 1 つもないかのどちらかでなければなりません。初期ファイル システムがなければ、コンテナの起動エージェントがディスクを ext4 にフォーマットします。この場合、読み取り / 書き込みモードのアタッチとマウントのみがサポートされます。
  • ディスクが VM にアタッチされている必要があります。
  • パーティションレス デバイスとパーティションの両方がサポートされています。パーティションをマウントする場合、ディスクが空であってはなりません。既存のパーティション分割テーブルが含まれている必要があります。

Console

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [コンテナ] セクションで、DEPLOY CONTAINERをクリックします。

  3. [コンテナの構成] ページで、次の操作を行います。

    1. コンテナ イメージ名を指定します。
    2. [ボリュームのマウント] セクションで、[ボリュームを追加] をクリックします。
    3. [ボリュームのタイプ] リストから、[ディスク] を選択します。
    4. [マウントパス] フィールドで、永続ディスクをマウントするコンテナ ディレクトリ構造にパスを指定します。
    5. [ディスク名] リストから、マウントする既存のディスクを選択します。
    6. ディスクにパーティション テーブルが含まれる場合、マウントするパーティション番号を [パーティション] フィールドに指定します。ディスクにパーティションがない場合は、このフィールドを空白のままにします。
    7. [モード] リストで、ディレクトリを読み取り / 書き込みモードと読み取り専用モードのどちらでマウントするかを指定します。
    8. コンテナの詳細を確認するには、[選択] をクリックします。
  4. VM 作成プロセスを続行します。

gcloud

永続ディスクをコンテナにマウントするには、gcloud compute instances create-with-container コマンド、または --container-mount-disk フラグを指定した gcloud compute instances update-container コマンドを使用します。

次の例では、my-data-diskmy-scratch-disk の 2 つのディスクを、/disks/data-disk および /disks/scratch-disk マウントパスにあるコンテナにマウントします。

gcloud compute instances create-with-container busybox-vm \
  --disk name=my-data-disk \
  --create-disk name=my-scratch-disk,auto-delete=yes,image=ubuntu-1710-artful-v20180315,image-project=ubuntu-os-cloud \
  --container-image docker.io/busybox:1.27 \
  --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=ro \
  --container-mount-disk mount-path="/disks/scratch-disk",name=my-scratch-disk

--disk フラグで my-data-disk の接続、--create-disk フラグで my-scatch-disk の作成と接続、--container-mount-disk フラグで接続されたディスクのコンテナへのマウントを指定しています。my-scratch-diskmode は指定されていないため、このディスクはデフォルトの読み取り / 書き込みモードでコンテナにマウントされます。

他の接続済みディスクをマウントする場合や、既存のディスクのマウントを変更する場合は、--container-mount-disk フラグを指定した gcloud compute instances update-container コマンドを使用します。

指定したマウントパスに一致するディスク ボリュームのマウントを削除するには、--remove-container-mounts フラグを使用します。次の例では、my-data-disk のマウントモードを読み取り / 書き込みに変更し、mount-path="/disks/scratch-disk" を指定してディスク マウントを削除しています。

gcloud compute instances update-container busybox-vm \
  --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=rw \
  --remove-container-mounts "/disks/scratch-disk"

--remove-container-mounts フラグに渡したマウントパスが存在しない場合は、通知なく無視されます。

コンテナポートの公開

コンテナを伴う VM ではホスト ネットワーク モードが使用されます。このモードでは、コンテナはホストのネットワーク スタックを共有し、ホストのインターフェースはすべてコンテナから使用可能です。

コンテナポートには、ホスト VM ポートへの 1 対 1 のマッピングがあります。たとえば、コンテナポート 80 はホスト VM ポート 80 にマップされます。Compute Engine ではポートの公開(-p)フラグをサポートしていないため、このフラグを指定しなくても、マッピングは機能します。

コンテナのポートを公開するには、ホスト VM インスタンスのポートへのアクセスを許可するようにファイアウォール ルールを構成します。コンテナの対応するポートには、ファイアウォールのルールに従って自動的にアクセスできるようになります。

例: NGINX コンテナのポート 80 を公開する

次に、NGINX コンテナを使用して VM インスタンスを作成し、コンテナのポート 80 へのトラフィックを許可する方法の例を示します。

  1. NGINX コンテナを使用して VM インスタンスを作成します。

    gcloud compute instances create-with-container nginx-vm \
     --container-image gcr.io/cloud-marketplace/google/nginx1:1.15 \
     --tags http-server
    

    コンテナはホスト VM のネットワーク スタックを共有し、コンテナのポート 80 はホスト VM のポート 80 に対して公開されます。http-server タグは、次の手順で作成されるファイアウォール ルールのターゲットタグとして使用されます。

  2. VM インスタンスのポート 80 への接続を許可するファイアウォール ルールを作成します。次のファイアウォール ルールでは、http-server タグが設定された VM インスタンスへの HTTP 接続を許可します。

    gcloud compute firewall-rules create allow-http \
     --allow tcp:80 --target-tags http-server
    

    コンテナは、自動的にポート 80 でトラフィックの受信を開始します。追加の構成を実行する必要はありません。

    ホスト VM のプロトコル:ポートの組み合わせに対するファイアウォール ルールを作成できます。ここで、プロトコルは tcp または udp です。このようなルールにより、VM 外から該当するコンテナポートへのアクセスが効果的に管理されます。

次のステップ