GCE: コンテナをデプロイする#
本記事では、GCEにコンテナをデプロイする方法を紹介します。
GCEでDockerイメージをホストするには以下を実施します。
Dockerイメージをアップロードする
VMインスタンスを作成する
公開する
Dockerイメージをアップロードする#
Google Cloud Platform内でコンテナイメージを参照できるように、 Google Container RegistryにDockerイメージをアップロードします。
注釈
本節の説明は Container Registry のクイックスタート をかいつまんだ概要となっています。不明な点はリンク先を参照してください。
まず、Dockerfileからイメージを作成します。
$ docker build -t [image_name]:[tag_name] .
次に、見分けがつくように専用のタグをつけます。
$ docker tag [image_name]:[tag_name] us.gcr.io/[PROJECT-ID]/[image_name]:[tag_name]
※ us.gcr.ioはgoogle container registryのホスト名です。他にもasia.gcr.ioやeu.gcr.io等があります。
最後に、アップロードします。
$ docker push us.gcr.io/[PROJECT-ID]/[image_name]:[tag_name]
アップロードしたイメージはGoogle Cloud PlatformのPROJECT-IDに該当するプロジェクトのContainer Registryで確認することができます。

image_name毎にディレクトリが作成されます。#
VMインスタンスを作成する#
コンテナイメージのアップロードができたので、次はそれを用いてVMインスタンスを作成します。 Google Compute Engineを開き、「インスタンスを作成」をクリックすると、

以下のページが開きます。

各入力は以下のようにします。
名前:識別のためのインスタンス名をつけます。
リージョン:データセンターの場所を選択します。always freeで利用するためus-central1としています。
ゾーン:適当に選びます。
マシンの構成:always freeで利用するためf1-microとしています。

コンテナ:「このVMインスタンスにコンテナイメージをデプロイします。」にチェック
コンテナイメージ:コンテナのタグを入力します。ex) us.gcr.io/[PROJECT-ID]/[image_name]:[tag_name]
コンテナの詳細オプション->環境変数:必要な環境変数を入力します。(PhoenixならSECRET_KEY_BASE等)
ブートディスク:コンテナをホストするOSですが、適切なイメージが選択されるので変更不要です。

ファイアウォール:Webサーバー(Phoenix等)をホストする場合はチェックを入れます。
入力が完了したら、作成をクリックします。
VMインスタンスにSSHする#
作成したVMインスタンスにはSSHできます。
VMインスタンスの詳細を開き、SSHボタンをクリックします。

少しまつと、接続が完了し、以下の画面が開きます。

コンテナの状態は、docker container list
でコンテナIDを調べ、 docker attach
で確認することができます。
always freeについて#
Google CloudにはAlways Freeと呼ばれる無料枠 が存在します。
各サービスごとに無料となる条件及び上限枠が決まっていますので、確認して利用するとよいです。
公開する#
インスタンス作成時には エフェメラル外部IPアドレス が与えられます。
このIPアドレスはインスタンスの再起動で解放/再取得されるため、公開するには 静的外部IPアドレス の予約が必要です。
VPCネットワーク->外部IPアドレスのページを開き、

種類をエフェメラルから静的に変更します。
後は、さくらのドメインやお名前ドットコム等のお使いのサービスでゾーン編集をし、 外部アドレスと名前を紐付ければ公開できます。
注釈
イメージ内でlet's encryptのcertbotを動作させたくない場合、Cloudflareを使う選択肢があります。
Container Optimized OS を モニタリングする#
metadataとして google-monitoring-enabled=true を付加すると起動時に systemctl start stackdriver-logging/stackdriver-monitoring が実行される。 これによって、モニタリング、ロギングができる。
ロギングできるのは、 google-monitoring-enabled=true の付加をすると自動的に google-logging-enabled=true も付加されるからだった。
ただし、 stackdriver-logging は f1-micro には負荷が大きいようで、モニタリングが行われない、SSH ができなくなるなどが起きた。 これに対処する場合は、 google-logging-enabled=true は削除すればよいが、GUI経由では(おそくらバグで)消すことができず、gcloudコマンド経由で行う必要がある。
また、COSの /etc/docker/daemon.json は cloud-init で書き変えることができるので、 log-driver をjounaldに変更する等ができる。