ホームページ >バックエンド開発 >Golang >マルチステージビルドによる Go API の Docker 化

マルチステージビルドによる Go API の Docker 化

Barbara Streisand
Barbara Streisandオリジナル
2024-10-08 06:30:021105ブラウズ

Dockerizing Your Go API with Multi-Stage Builds

それではチーム!私たちは Go API をDocker 化することで次のレベルに引き上げ、さらに重要なことに、マルチステージ ビルドで軽量かつ効率的にすることです。この投稿を終えるまでに、移植性があるだけでなく、より迅速なデプロイメントのために最適化された API が完成します。 ?

なぜマルチステージビルドなのか? ?

マルチステージビルドでは、ビルド環境をランタイム環境から分離することで、最終的なDockerイメージを無駄のない状態に保つことができます。 Go アプリケーションの場合、これは特に便利です。アプリケーションを 1 段階で (必要なツールと依存関係をすべて備えて) ビルドし、結果として得られるバイナリのみをより小さな最終イメージにコピーできるからです。

マルチステージビルドの利点:

  • イメージ サイズの縮小: 不要なビルド依存関係を削除することで、サイズが数分の一のイメージになります。
  • 迅速な展開: イメージが小さいほど、ダウンロードと展開が高速になります。
  • 攻撃対象領域の削減: ランタイム環境のコンポーネントが少ないということは、潜在的な脆弱性が少ないことを意味します。

ステップ 1: マルチステージ ビルドで Dockerfile を作成する

多段階ビルドを利用する Dockerfile を作成しましょう。これにより、最終的な画像サイズが小さくなり、本番環境向けに Go API を最適化することができます。

次の内容を含む Dockerfile をプロジェクトのルートに作成します。


# Build stage
FROM golang:1.21.0-alpine3.17 AS builder
WORKDIR /app
COPY . .

# Install dependencies and build the application
RUN go mod download
RUN go build -o main .

# Run stage (lightweight)
FROM alpine:3.18.3
WORKDIR /app

# Copy the binary from the builder stage
COPY --from=builder /app/main .

# Expose the API port
EXPOSE 8000

# Run the binary
CMD ["/app/main"]


Dockerfile の内訳:

  1. ビルダーステージ:

    • 標準の Go イメージよりも小さい、公式の Go Alpine イメージから始めます。
    • すべての依存関係がダウンロードされ、go build を使用してアプリケーションをバイナリ (メイン) にコンパイルします。
  2. ランタイムステージ:

    • Go コンパイラーやその他のビルド依存関係が含まれていない、さらに軽量な Alpine イメージに切り替えます。
    • コンパイルされたバイナリはビルダー段階からコピーされ、API へのアクセスを許可するためにポート 8000 を公開します。

このアプローチでは、最終的なイメージには API の実行に必要なもののみが含まれるため、大幅に小さいイメージが生成されます。


ステップ 2: Docker コンテナの構築と実行

最適化された Dockerfile が完成したので、Docker イメージをビルドして実行しましょう。

  1. Docker イメージをビルドします:

   docker build -t my-go-api .


  1. Docker コンテナを実行します:

   docker run -p 8000:8000 my-go-api


ローカル マシンで実行したのと同じように、API が http://localhost:8000 で実行されていることがわかります。


ステップ 3: スクラッチ イメージを使用してさらに最適化する (オプション)

さらに最適化するには、Alpine ランタイム ステージを スクラッチ イメージに置き換えることができます。スクラッチ イメージは完全に空であり、OS もユーティリティも含まれていないため、イメージ サイズはさらに小さくなります。ただし、これはコンテナ内のデバッグ ツールにアクセスできなくなることも意味します。

スクラッチ イメージを使用した Dockerfile は次のようになります:


# Build stage
FROM golang:1.21.0-alpine3.17 AS builder
WORKDIR /app
COPY . .

RUN go mod download
RUN go build -o main .

# Run stage
FROM scratch
WORKDIR /app

COPY --from=builder /app/main .

EXPOSE 8000

CMD ["/app/main"]


このアプローチにより、最終的な画像サイズをわずか 10~15MB に抑えることができます。ただし、スクラッチの使用は、非常に基本的な自己完結型アプリケーションに最適であることに注意してください。


ステップ 4: 最適化されたコンテナをテストしますか?

コンテナをテストして、期待どおりに動作することを確認しましょう:


curl http://localhost:8000/books


API が正しく応答した場合は、おめでとうございます! Docker を使用して Go API を最適化し、コンテナ化することに成功しました。 ?

実稼働環境におけるマルチステージビルドの利点

  • 効率的な展開: イメージが小さいほどプル時間が短縮され、実稼働環境では重要になる可能性があります。
  • リソースの節約: ストレージとメモリのフットプリントが削減されるため、インフラストラクチャのコストが低く抑えられます。
  • セキュリティ: 最終イメージのコンポーネントが少ないため、脆弱性の可能性が低くなります。
次は何ですか?

これで、API が Docker 対応になり、実稼働向けに最適化されたので、スムーズなデプロイとスケーリングの準備が整いました。次回は、ギアを変えて、Go の

単体テストに詳しく取り組み、API がデプロイ可能であるだけでなく、盤石であることを確認します。 ??

また、最新情報については、ThrottleX GitHub リポジトリにも注目してください。カスタム レート リミッターの統合に関するチュートリアルを近々投稿する予定です。

以上がマルチステージビルドによる Go API の Docker 化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。