🐉

GCPのCompute EngineにDcokerコンテナをデプロイする

2024/01/17に公開

Compute Engineにコンテナをデプロイする作業メモです。
やりたいこととしては「手元で作ったnodeのサーバプロジェクトのdocker imageを作ってGCRに上げてGCEにデプロイして外部からアクセスしたい」という感じです。

GCRへDockerコンテナをpushする

イメージのビルド

docker build -t gcr.io/[PROJECT_ID]/[IMAGE_NAME] .

ここで [PROJECT_ID] は GCP のプロジェクトID、[IMAGE_NAME] はイメージの名前。

GCRにイメージをプッシュ

docker push gcr.io/[PROJECT_ID]/[IMAGE_NAME]

ここで下記エラーが出ました。

unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication

GCRへの認証が通っていないっぽい。

gcloudでの認証

GCPへログイン

gcloud auth login

Dockerとgcloudの連携

gcloud auth configure-docker

下記の質問が出てYを入力して進めた。

Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
After update, the following will be written to your Docker config file located at [/Users/satoshi/.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"
  }
}

Do you want to continue (Y/n)? Y

再度docker push

成功した。

The push refers to repository [gcr.io/[PROJECT_ID]/[IMAGE_NAME]]
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
************: Pushed 
latest: digest: sha256:****************** size: 2205

Compute Engine でのインスタンス起動

  1. GCP コンソールにアクセスしてログインします。
  2. 「Compute Engine」セクションに移動します。
  3. 「インスタンスの作成」をクリックし、必要な設定を行います。
  4. 「コンテナイメージ」に先程のコンテナのパスを入れます。

起動スクリプトを設定

自動でdockerをpullして起動するために下記を「起動スクリプト」に追加。

#!/bin/bash
docker pull gcr.io/[PROJECT_ID]/[IMAGE_NAME]
docker run -p 3000:3000 gcr.io/[PROJECT_ID]/[IMAGE_NAME]

起動しているか確認

コンテナ一覧の「SSH」からインスタンス内に入れます。

$ docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS                          PORTS     NAMES
ec7c48d3d96b   gcr.io/[PROJECT_ID]/[IMAGE_NAME]   "docker-entrypoint.s…"   2 minutes ago   Restarting (1) 59 seconds ago             klt-IMAGE_NAME-trxd

docker logsで下記エラーが出ていました。

$ docker logs ec7c48d3d96b
exec /usr/local/bin/docker-entrypoint.sh: exec format error
exec /usr/local/bin/docker-entrypoint.sh: exec format error
exec /usr/local/bin/docker-entrypoint.sh: exec format error
exec /usr/local/bin/docker-entrypoint.sh: exec format error

これはDocker コンテナのイメージが、実行しようとしている環境と互換性がない場合に発生するらしいです。

なので--platform linux/x86_64という感じでアーキテクチャを指定してdockerイメージをビルドしたら解消しました。

docker build --platform linux/x86_64 -t [IMAGE_NAME] .

外部からコンテナへのアクセスを許可

ファイアウォールでアクセスを許可します。

再起動ごとにIPアドレスが変わると不便なので、外部IPアドレスに静的アドレスを選んで固定します。

以上の外部IPアドレスにアクセスすると起動しているコンテナにアクセスすることができます。

Discussion