🐉
GCPのCompute EngineにDcokerコンテナをデプロイする
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 でのインスタンス起動
- GCP コンソールにアクセスしてログインします。
- 「Compute Engine」セクションに移動します。
- 「インスタンスの作成」をクリックし、必要な設定を行います。
- 「コンテナイメージ」に先程のコンテナのパスを入れます。
起動スクリプトを設定
自動で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