Dockerイメージを使ってWebアプリをGoogle Compute Engineで動かす

ASP.NET Core MVCのアプリをGCPで公開できたので、その手順をまとめます。

前提

Container Registryの認証設定

Container RegistryにDockerイメージを登録する時にはdocker pushを使いますが、その前に認証設定が必要です。

認証方法 | Container Registry | Google Cloud

このドキュメントの書かれていることがよく分からず、とりあえず以下の2つを実行しました。

ただよく読むと、どちらかだけ行えばよかったのかもしれません。Docker 認証ヘルパーとしての gcloudの節には、

可能であれば、この方法を使用することを強くおすすめします。この方法では、プロジェクト リソースに安全で短期間のアクセス権が付与されます。

と書かれているので、どちらかであれば上の方法の方がよいみたいです。

とりあえず両方のやり方を載せます。

gcloudをDocker 認証ヘルパーとして使う設定

以下のコマンドを実行します。

$ gcloud auth configure-docker
WARNING: `docker-credential-gcloud` not in system PATH.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
WARNING: `docker` not in system PATH.
`docker` and `docker-credential-gcloud` need to be in the same PATH in order to work correctly together.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
The following settings will be added to your Docker config file
located at [C:\Users\loca\.docker\config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

警告が出ていますが特に問題なくイメージの登録ができたので、今回は無視します。

スタンドアロン Docker 認証ヘルパー

以下の2つのコマンドを実行します。

$ gcloud components install docker-credential-gcr

Restarting command:
  $ gcloud components install docker-credential-gcr

$ docker-credential-gcr
C:\Users\loca\.docker\config.json configured to use this credential helper for GCR registries

DockerイメージをContainer Registryに登録する

以下のドキュメントに沿って登録します。

イメージの push と pull  |  Container Registry  |  Google Cloud

Dockerイメージへのタグ付け

Dockerイメージに以下のような決まったフォーマットのタグを付ける必要があるようです。

[HOSTNAME]/[PROJECT-ID]/[IMAGE]

HOSTNAMEはContainer Registryの場所で、以下の4つがあります。

・ gcr.io は米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
・ us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
・ eu.gcr.io は、欧州連合でイメージをホストします。
・ asia.gcr.io は、アジアでイメージをホストします。

今回は無料枠のCompute Engineを使うので、それに合わせて米国に作られるようにus.gcr.ioを使います。※Compute Engineの無料枠は米国の特定のリージョンでなければ適用されないため。

PROEJCT-IDは今回のアプリを動かすプロジェクトのIDです。Googleアカウントでログインしていれば、プロジェクトのホームの「プロジェクト情報」に載っています。

https://console.cloud.google.com/home

IMAGEはDockerイメージの名前で、今回はsampleappです。

以上から、タグの名前は以下のようになります。

us.gcr.io/[PROJECT-ID]/sampleapp

そしたらdockerコマンドでイメージにタグを付けます。

$ docker tag sampleapp us.gcr.io/[PROJECT-ID]/sampleapp

docker pushでDockerイメージをContainer Registryに登録します。

$ docker push us.gcr.io/[PROJECT-ID]/sampleapp
The push refers to repository [us.gcr.io/[PROEJCT_ID]/sampleapp]
cd1a588c63a5: Pushed
e5f18c307014: Pushed
e7ba18774395: Pushed
a0afac1d9f1c: Pushed
3fb318ee8d39: Pushed
ef68f6734aa4: Layer already exists
latest: digest: sha256:c60eae957fe7a7729b4b3c3199d96985674641962f579d7010cd8edb43511ffb size: 1581

これでContainer Registoryにイメージが登録されます。

Compute EngineでDockerイメージを使ってアプリを起動する

Compute Engineのインスタンス作成画面で以下のように設定し、他の項目は適宜変更して作成します。

  • 「この VM インスタンスにコンテナ イメージをデプロイします。」にチェック
  • 「コンテナイメージ」にDockerイメージの名前を設定
    • us.gcr.io/[PROJECT-ID]/sampleapp
  • 「HTTP トラフィックを許可する」にチェック

f:id:LocaQ:20190114231752p:plain

作成が完了して起動したら、外部IDアドレスを確認してブラウザからアクセスします。

http://xxx.xxx.xxx.xxx/

これでとりあえずアプリの公開ができました。

もしアクセスできなければ、以下のページのトラブルシューティングが参考になるかもしれません。

Running a basic Apache web server  |  Compute Engine Documentation  |  Google Cloud