Dockerイメージを使ってWebアプリをGoogle Compute Engineで動かす
ASP.NET Core MVCのアプリをGCPで公開できたので、その手順をまとめます。
前提
- GCPのアカウント作成済み
- Google Cloud SDKをインストール済み
- Docker for Windowsをインストール済み
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 トラフィックを許可する」にチェック
作成が完了して起動したら、外部IPアドレスを確認してブラウザからアクセスします。
http://xxx.xxx.xxx.xxx/
これでとりあえずアプリの公開ができました。
もしアクセスできなければ、以下のページのトラブルシューティングが参考になるかもしれません。
Running a basic Apache web server | Compute Engine Documentation | Google Cloud