Docker Hubで配布されているDocker ImageをGoogle Container Registry に push してそのImageを元にVMを起動する


注意

本記事は自分用のメモの為、体裁が整っていません。ご了承ください。

記事を書く動機

以下のようなケースに対処する必要があり、手順などをアウトプットするため。

  • Digdag, Embulk サーバー構築用の Docker Image を(Docker Hubで)共有してもらい、
  • それを用いてGCPのVMを立ててサーバー構築する

参考ページ

始める前に

  1. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。
  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。(参考
  3. Container Registry API を有効にします。
  4. Cloud SDK をインストールして初期化します。
  5. Docker をインストールします。
    1. Ubuntu, debianなどの場合は、sudo usermod -a -G docker ${USER}+再起動により、sudoなしでdockerコマンドを実行できるようにしましょう

手順一覧

  1. Docker Imageを Docker Hub から pullする
  2. (pullした)Docker Image を Container Registry にpushする
  3. Container Registry に push したDocker Imageを元にVMを起動する
  4. 課金されないようにクリーンアップ

1. Docker Imageを Docker Hub から pullする

今回は例として、busyboxを使います。

docker pull busybox:latest
# check image
docker image ls
REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
busybox     latest  6d5fcfe5ff17  8 months ago  1.22MB

2. (pullした)Docker Image を Container Registry にpushする

2.1. gcloud コマンドライン ツールを認証ヘルパーとして使用するように docker を構成する

以下、参考ページより引用

イメージを push または pull するには、gcloud コマンドライン ツールを使用して Container Registry へのリクエストを認証するように Docker を構成する必要があります。これを行うには、次のコマンドを実行します(実行する必要があるのは一度だけです)。

gcloud auth configure-docker

2.2. イメージにレジストリ名をタグ付けする

docker push は通常だとDocker Hubにpushします。特定の場所にpushしたい場合は、レジストリ名のタグを書き換えることで制御するようです。

参考ページより引用

Docker イメージを Container Registry に push する前に、そのイメージにレジストリ名をタグ付けする必要があります。Docker イメージにレジストリ名をタグ付けすると、イメージを特定の場所に push するように docker push コマンドが構成されます。このクイックスタートでは、ホストの場所は gcr.io です。Docker イメージにタグを付けるには、次のコマンドを実行します。

docker tag busybox gcr.io/[PROJECT-ID]/busybox:v1
# check img
REPOSITORY                   TAG  IMAGE ID      CREATED       SIZE
gcr.io/[PROJECT-ID]/busybox  v1   6d5fcfe5ff17  8 months ago  1.22MB

2.3. イメージを Container Registry に push する

docker push gcr.io/[PROJECT-ID]/busybox:v1

3. Container Registry に push したDocker Imageを元にVMを起動する

※一旦GUIでVM起動するケースを考える

GCPのダッシュボード画面から ComputeEngine->VMインスタンス という流れでVMインスタンス起動画面に移行する。

VM起動画面において、コンテナイメージからインスタンス生成する旨を入力する(下図)

コンテナイメージには、例に記載されたように事前にpushしたコンテナイメージのパスを記載する。
ContainerRagistryに保存しているコンテナイメージを指定する際は、gcr.io/... というパスになる。

※本VMと同一プロジェクト内のGCRに保存されているイメージに対してはデフォルトでpullする権限が与えられているのでアクセス権限周りは調整する必要はない。そうでない場合は、イメージをpullしようとするサービスアカウントに対して、コンテナイメージを格納しているGCSバケットに対して適切なアクセス権限を付与する必要がある。
参考

あとはVMインスタンス作成ボタンを押すだけ。

4. 課金されないようにクリーンアップ

4.1. ContainerRegistryのクリーンアップ

Google Cloud での Container Registry の使用によれば、

gcloud container images delete gcr.io/[PROJECT-ID]/busybox:v1 --force-delete-tags

で実行できるとのことだが、以下のエラーによりgcloudコマンドからのDocker Image 削除ができなかった。

ERROR: (gcloud.container.images.delete) [gcr.io/[PROJECT-ID]/busybox:v1] is not a valid name. Expected tag in the form "base:tag" or "tag" or digest in the form "sha256:<digest>"

(現在調査中……)

今回は、Google Cloud ConsoleよりGCRの該当イメージを削除する。

つもりが、見当たらない。。。。(?)

4.2. ComputeEngineのクリーンアップ

Google Cloud Console でVMインスタンスを削除します。