PR

Go言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法

3. 応用

こんにちは。Tomoyuki(@tomoyuki65)です。

Go言語で作ったAPIなどを本番環境にデプロイしたい場合、まずはコンテナ保存用のクラウドサービスに登録する必要がでてくると思います。

例えばGoogle CloudであればArtifact Registry(GAR)がコンテナやパッケージを安全に管理できるGoogleのクラウドサービスです。

この記事では、Go言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法について解説します。

※以下ではGoogle Cloudおよびgcloudコマンドを使います。実際に試したい場合は以下の記事などを参考に、プロジェクトの作成およびgcloudコマンドの準備をして下さい。

 

関連記事

Go言語(Golang)のAPIをGoogleのCloud SQLとCloud Runでデプロイする方法
こんにちは。Tomoyuki(@tomoyuki65)です。以前にGo言語(Golang)でEchoのAPIを開発する方法に関する記事を書きましたが、今回はそのコードを使ってGoogleのCloud SQL(MySQL)とCloud Run...
HomebrewでGoogle Cloud SDKをインストールしてgcloudコマンドを使えるようにする方法
こんにちは。Tomoyuki(@tomoyuki65)です。インフラにGoogle Cloudを使い、ローカルから各種操作をしたい場合、事前に「gcloud」コマンドを使えるようにしておく必要があると思います。この記事では、そんなgclou...

 

Go言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法

まずはGo言語(Golang)で簡単なAPIを作成するため、以下のコマンドを実行して各種ファイルを作ります。

$ mkdir infra-sample && cd infra-sample
$ mkdir -p deploy/docker/local && touch deploy/docker/local/Dockerfile
$ mkdir src && touch src/main.go
$ touch compose.yml

 

次に作成したファイルをそれぞれ以下のように記述します。

・「deploy/docker/local/Dockerfile」

FROM golang:1.25.3-alpine3.22

# タイムゾーンを設定
ENV TZ=Asia/Tokyo

WORKDIR /go/src

COPY ./src .

# go.modがあれば依存関係をインストール
RUN if [ -f ./go.mod ]; then \
      go install; \
    fi

# 開発用のライブラリをインストール
RUN go install github.com/air-verse/air@v1.63.0
RUN go install honnef.co/go/tools/cmd/staticcheck@latest

EXPOSE 8080

 

・「src/main.go」

package main

import (
    "fmt"
)

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

 

・「compose.yml」

services:
  go-api:
    container_name: go-api
    build:
      context: .
      dockerfile: ./deploy/docker/local/Dockerfile
    command: air -c .air.toml
    volumes:
      - ./src:/go/src
    ports:
      - "8080:8080"
    tty: true
    stdin_open: true

 

次に以下のコマンドを実行し、コンテナをビルドします。

$ docker compose build --no-cache

 

次に以下のコマンドを実行し、各種初期化処理をします。

$ docker compose run --rm go-api go mod init go-api
$ docker compose run --rm go-api air init

 

次にファイル「src/main.go」を以下のように修正します。

package main

import (
    "log/slog"
    "net/http"

    "github.com/labstack/echo/v4"
)

func main() {
    // echoのルーター設定
    e := echo.New()

    e.GET("/hello", func(c echo.Context) error {
        // レスポンス結果の設定
        res := map[string]string{
            "message": "Hello World !!",
        }

        return c.JSON(http.StatusOK, res)
    })

    e.GET("/test", func(c echo.Context) error {
        // レスポンス結果の設定
        res := map[string]string{
            "message": "Test !!",
        }

        return c.JSON(http.StatusOK, res)
    })

    // ログ出力
    slog.Info("Start go-api !!")

    // サーバー起動
    e.Logger.Fatal(e.Start(":8080"))
}

 

次に以下のコマンドを実行し、go.modを更新します。

$ docker compose run --rm go-api go mod tidy

 

次に以下のコマンドを実行し、コンテナの再ビルドおよび起動します。

$ docker compose build --no-cache
$ docker compose up -d

 

次に以下のコマンドを実行し、ログ出力を確認します。

$ docker compose logs

 

実行後、以下のように設定したログが出力されて起動すればOKです。

 

次にPostmanを使ってGo言語で作成したAPIを試してみます。

まずはGETメソッドで「http://localhost:8080/hello」を実行し、以下のように正常終了すればOKです。

 

次にGETメソッドで「http://localhost:8080/test」を実行し、以下のように正常終了すればOKです。

 

次に以下のコマンドを実行し、コンテナを削除しておきます。

$ docker compose down

 

本番環境のGAR用のDockerコンテナの作成とテスト

次に本番環境であるGoogle Cloud Artifact Registry(GAR)にデプロイするためのDockerコンテナを作るため、以下のコマンドを実行してDockerfileを作成します。

$ mkdir -p deploy/docker/prod && touch deploy/docker/prod/Dockerfile

 

次に作成したDockerfileを以下のように記述します。

・「deploy/docker/prod/Dockerfile」

####################
# ビルドステージ
####################
FROM golang:1.25.3-alpine3.22 AS builder

WORKDIR /go/src

COPY ./src .

# 依存関係をインストール
RUN go install

# ビルド(GOOS:OS指定、GOARCH:CPUアーキテクチャ指定)
RUN GOOS=linux GOARCH=amd64 go build -o main .

####################
# 実行ステージ
####################
FROM alpine:3.22 AS runner

# タイムゾーンを設定
ENV TZ=Asia/Tokyo

# インストール可能なパッケージ一覧の更新
RUN apk update && \
    apk upgrade && \
    # パッケージのインストール(--no-cacheでキャッシュ削除)
    apk add --no-cache \
            tzdata

WORKDIR /app

# コンテナ用ユーザー作成
RUN addgroup --system --gid 1001 appuser && \
    adduser --system --uid 1001 appuser

# ビルドステージで作成したバイナリをコピー
COPY --from=builder --chown=appuser:appuser ./go/src/main .

# ポートを設定
EXPOSE 8080

# コンテナ起動ユーザー設定
USER appuser

# APIサーバー起動コマンド
CMD ["./main"]

※Cloud Run用のコンテナを作る場合は、Goのビルド時に「GOOS=linux GOARCH=amd64」が必要です。

 

次に以下のコマンドを実行し、コンテナをビルドおよび起動します。

$ docker build --no-cache -f ./deploy/docker/prod/Dockerfile -t go-api:1.0.0 .
$ docker run -d -p 80:8080 go-api:1.0.0

※コンテナをビルドする際は本番環境用を想定し、タグにバージョン「1.0.0」を含めるようにしています。

 

次にDocker Desktopからコンテナが起動していることを確認し、コンテナ名をクリックします。

 

コンテナのログを確認し、以下のように設定したログが出力されていればOKです。

 

次にPostmanを使ってAPIを試してみます。

まずはGETメソッドで「http://localhost/hello」を実行し、以下のように正常終了すればOKです。

 

次にGETメソッドで「http://localhost/test」を実行し、以下のように正常終了すればOKです。

 

次にDocker Desktopから対象のコンテナを削除しておきます。

コンテナ一覧画面に戻り、対象のコンテナの右側にある「ゴミ箱ボタン」をクリックします。

 

次にポップアップが表示されるので、「Delete forever」をクリックして削除します。

 

Google CloudのArtifact Registry(GAR)にリポジトリを作成する

次にGoogle CloudのArtifact Registry(GAR)にDockerコンテナをデプロイするためのリポジトリを作成します。

Google Cloudで対象のプロジェクト画面を開いた後、画面上の検索バーからサービス「Artifact Registry」を検索してクリックして下さい。

 

次に画面上の「+ リポジトリの作成」をクリックします。

 

これでリポジトリ作成画面が表示されます。

 

次に名前に「go-api」を入力します。

※形式とモードはデフォルトでOK

 

次にロケーションタイプは、リージョンに「us-central1(アイオワ)」を選択、説明に「テスト用」を入力後、「+ ラベルを追加」をクリックします。

※リージョンはCloud Strageの無料枠の対象になる「us-central1(アイオワ)」と合わせる形で選択しています。

 

次にラベルのキーに「env」、値に「dev」を設定します。

※ラベル設定は必須ではありませんが、実務を想定して設定を試します。

 

次にクリーンアップポリシーの設定では「アーティファクトを削除」を選択し、「クリーンアップポリシーを追加」をクリックします。

※クリーンアップポリシーの設定も必須ではありませんが、実務ではなんらかの設定をすることを想定して試します。

 

次にクリーンアップポリシーの作成画面が開きますが、様々な設定が可能になってます。

 

今回は名前に「最新3個まで残す」、ポリシータイプに「最新バージョンを保持」を選択、保持数に「3」を入力後、「完了」をクリックします。

 

次にArtifact Analysisの脆弱性スキャンがデフォルトで有効になっていますが、これは別途料金が発生すると思われるので、「無効」を選択しておきます。

そして全ての設定完了後、「作成」をクリックします。

 

これでDockerコンテナを保存するためのリポジトリの作成が完了です。

リポジトリのパスは後で使うため、画面右上の「パスをコピー」をクリックしてコピーし、メモしておきましょう。

※パスは「us-central1-docker.pkg.dev/<プロジェクトID>/go-api」のようなものが取得できます。

 

gcloudコマンドでArtifact Registryに対するリクエストの認証設定

次にGoogle Cloud CLIのgcloudコマンドを使い、Artifact Registryに対するリクエスの認証設定を行います。

今回はリージョンに「us-central1(アイオワ)」を指定したため、以下のコマンドを実行します。

$ gcloud auth configure-docker us-central1-docker.pkg.dev

※他のリージョンを使っている場合はリージョンごとに設定が必要です。

 

コマンド実行後、Do you want to continue (Y/n)?と聞かれるので、「y」を入力してEnterを押します。

実行後、「Docker configuration file updated.」が表示されればOKです。

これでdockerコマンドからArtifact Registryに対してコンテナをプッシュできるようになります。

 

DockerコマンドでArtifact Registryの対象のリポジトリにコンテナをプッシュ

次に上記で事前にビルドして作成したコンテナ「go-api:1.0.0」を使い、以下のコマンドを実行してArtifact Registryにプッシュできるように新しくタグ付けします。

$ docker tag go-api:1.0.0 us-central1-docker.pkg.dev/<プロジェクトID>/go-api/go-api:1.0.0

※<プロジェクトID>は各自の環境に合わせて修正して下さい。

 

次に以下のコマンドを実行し、Artifact Registryの対象のリポジトリにコンテナをプッシュします。

$ docker push us-central1-docker.pkg.dev/<プロジェクトID>/go-api/go-api:1.0.0

※<プロジェクトID>は各自の環境に合わせて修正して下さい。

 

コマンド実行後、ターミナルでは以下のようになります。

 

次にGoogle CloudのArtifact Registryの対象のリポジトリ画面に戻り、画面右上の「更新」をクリックします。

 

これでプッシュしたコンテナが表示されればOKです。次にコンテナ名をクリックしてみます。

 

以下のようにコンテナの情報が表示されればOKです。

ここまでできれば、あとはCloud Runなどを利用してコンテナのデプロイが可能です。

 

スポンサーリンク

最後に

今回はGo言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法について解説しました。

本番環境用のインフラにGoogle Cloudを使う場合は、Artifact Registryを使うことになると思うので、ぜひ参考にしてみて下さい。

 

コメント

タイトルとURLをコピーしました