開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. GCP >
  4. GCPのArtifact Registryにコンテナイメージを保存する

GCPのArtifact Registryにコンテナイメージを保存する

こんにちはナカエです。

本日はGoogle Cloud PlatformのArtifact Registryについての記事です。

Container Registryの既存の機能を改善・拡張したArtifact Registryは、DockerイメージのほかにもnpmやMaven、Pythonなどのパッケージの管理が統合されているのが大きな特徴です。 また今後は、Container RegistryではなくArtifact Registry向けに新機能がリリースされると告知されています。

参考: Artifact Registry: 次世代の Container Registry | Google Cloud Blog

今回はContainer Registryの代わりにArtifact Registryを用いて、ローカルでビルドしたコンテナイメージを保存する方法を紹介します。

検証環境とソフトウェアのバージョン

  • OS: macOS Monterey 12.4
  • CPU: Apple M1 Max
  • zsh 5.8.1
  • Homebrew 3.5.6
  • Google Cloud SDK 395.0.0
  • Docker Desktop for Mac 4.10.1
  • Go 1.18

Google Cloud Platformのプロジェクト作成

事前にGCPの管理画面で新規プロジェクトを作成し、

  • Artifact Registry API

を有効化しておきます。

Artifact Registryのリポジトリを作成

Container Registryと異なり、先にリポジトリを作成する必要があります。 管理画面からでも作成できますが、今回はCLIで作成します。

Google Cloud SDKをインストールしていない場合はHomebrewでインストールしましょう。

brew install --cask google-cloud-sdk

Google Cloud SDKでログインし、今回作成したプロジェクトを選択しておきます。

gcloud auth login
gcloud init

続いてコンテナイメージ用のリポジトリを作成します。 リポジトリ名はmyrepo、ロケーションはasia-northeast1(東京)リージョンとしています。

gcloud artifacts repositories create myrepo --location=asia-northeast1 --repository-format=docker

Artifact Registryの管理画面を開くとリポジトリが作成されていることが確認できます。 以降でこのリポジトリ内にコンテナイメージをプッシュしていきましょう。

artifact-registry-admin-1.png

コンテナイメージを作成

適当にディレクトリを作って作業します。

mkdir artifact-registry-test
cd artifact-registry-test

Go言語を用いて簡単なHello worldを実行するコンテナを作ることにします。 まずはmain.goを作成します。

main.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

続いてDockerfileを記述します。 Distrolessのイメージをベースにしたイメージになります。

参考: GoogleContainerTools/distroless - GitHub

Dockerfile

FROM golang:1.18 as build

WORKDIR /go/src/app
COPY . .

RUN go mod init hello
RUN CGO_ENABLED=0 go build -o /go/bin/app

FROM gcr.io/distroless/static-debian11
COPY --from=build /go/bin/app /
CMD ["/app"]

コンテナイメージをリポジトリにプッシュ

下記コマンドでDocker用のArtifact Registryの認証を設定し、

gcloud auth configure-docker asia-northeast1-docker.pkg.dev

ビルドしてプッシュします。
※ {PROJECT_ID} は先ほど作成したGCPのプロジェクトのIDで置き換えてください。

docker build ./ -t asia-northeast1-docker.pkg.dev/{PROJECT_ID}/myrepo/hello
docker push asia-northeast1-docker.pkg.dev/{PROJECT_ID}/myrepo/hello

管理画面で先ほど作成したmyrepoの中身を閲覧すると、新規にhelloという項目が作成されていることが確認できます。

artifact-registry-admin-2.png

一度ローカルのDockerイメージを削除し、

docker image rm asia-northeast1-docker.pkg.dev/arifact-registry/myrepo/hello

同じイメージ名を指定してdocker runを実行すると

docker run --rm asia-northeast1-docker.pkg.dev/arifact-registry/myrepo/hello

イメージがpullされて実行されることが確認できます。

Hello, world!

Artifact Registryの料金

一点、Artifact RegistryとContainer Registryでは料金体系が少々異なるので注意が必要です。

Container Registryの料金 はストレージの保存容量とデータ処理、および下り(外向き)ネットワークの通信量に対し、Cloud Storageの料金設定が適用されています。

Artifact Registryも従量課金の対象もほぼ同様でストレージの保存容量と下り(外向き)ネットワークの通信量となっていますが、Artifact Registry独自の料金設定になります。

例えばストレージの料金は

Container Registry Artifact Registry
  • $0.023/GB月
  • 東京(asia-northeast1
  • デフォルトではStandardクラスのCloudStorageを利用
  • 最大 0.5 GBまで: 無料
  • 0.5GB超: $0.10/GB月
  • マルチリージョンでも料金は変わらず

となっています。コンテナイメージを保存しておくだけでオペレーションが少ない場合であればArtifact Registryのほうがお高くなりそうですね。
 

また、オプションで有効化できる脆弱性スキャンについては双方変わらず、コンテナイメージのスキャン一回あたりに料金がかかります。

まとめ

Container Registryの代わりにArtifact Registryにコンテナイメージを保存することができました。 使い易さにほとんど変わりはないので、今後はArtifact Registryを積極的に選択していきたいですね。

TOPに戻る