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の管理画面を開くとリポジトリが作成されていることが確認できます。 以降でこのリポジトリ内にコンテナイメージをプッシュしていきましょう。
コンテナイメージを作成
適当にディレクトリを作って作業します。
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という項目が作成されていることが確認できます。
一度ローカルの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 |
|
|
となっています。コンテナイメージを保存しておくだけでオペレーションが少ない場合であればArtifact Registryのほうがお高くなりそうですね。
また、オプションで有効化できる脆弱性スキャンについては双方変わらず、コンテナイメージのスキャン一回あたりに料金がかかります。
まとめ
Container Registryの代わりにArtifact Registryにコンテナイメージを保存することができました。 使い易さにほとんど変わりはないので、今後はArtifact Registryを積極的に選択していきたいですね。
- GCP , コンテナ , Artifact Registry