Go (Golang) 用の Docker イメージ 小型で高速な Docker イメージとセキュリティ

王林
リリース: 2024-08-06 01:48:22
オリジナル
675 人が閲覧しました

週末の間、私は特に Go (Golang) アプリケーションで使用する Docker イメージについていくつかの調査を行っていました。そこで、技術プロジェクトで同じことを研究している人にとって役立つかもしれないので、興味深い発見を共有することを考えました。

ここでは、Golang 用のイメージを構築するいくつかの異なる方法について詳しく説明し、選択する際に考慮する必要があるセキュリティ上の考慮事項のいくつかについても強調します。

この演習では、Gin フレームワークを使用して Go (Golang) を使用して開発された単純な Rest API を使用しました。

Gin フレームワーク は、高速で使いやすく、効率性が高いように設計された Go (Golang) 用の人気のある Web フレームワークです。
 
主な機能と特徴を簡単にまとめます。

主な機能

  • パフォーマンス: ジンはその高いパフォーマンスで知られています。これは最速の Go Web フレームワークの 1 つであり、他のフレームワークと比較してオーバーヘッドが最小限に抑えられます。

  • 高速 HTTP ルーター: Gin は高速 HTTP ルーターを使用し、GET、POST、PUT、DELETE などのメソッドによるルーティングをサポートします。また、ミドルウェアとルート グループ化もサポートします。

  • ミドルウェアのサポート:gin は、ミドルウェアを使用してログ記録、認証、その他のリクエストの前処理または後処理などのタスクを処理する方法を提供します。

  • JSON 検証: このフレームワークは、JSON 検証の組み込みサポートと Go 構造体へのリクエスト データのバインドを提供し、JSON ペイロードの操作を容易にします。

  • エラー処理:gin には構造化されたエラー処理方法があり、集中エラー管理システムを提供しているため、エラーを適切に処理できます。

  • テンプレート レンダリング: Gin は主に API 開発用に設計されていますが、必要に応じて HTML テンプレート レンダリングをサポートします。

  • リクエスト処理: フォーム データ、JSON ペイロード、URL パラメーターなどのリクエスト処理のさまざまなメソッドをサポートします。

  • 組み込みデバッグ:gin は、開発中に役立つ詳細なエラー メッセージとデバッグ情報を提供します。

主要コンポーネント

  • ルーター: 適切なハンドラーへの HTTP リクエストのルーティングを処理するコア コンポーネント。

  • コンテキスト: リクエストとレスポンスのデータを運ぶ構造体、および
    それらを処理するメソッドを提供します。これはハンドラー内で広く使用されます。

  • エンジン: ルート、ミドルウェア、その他の設定で構成される、Gin アプリケーションのプライマリ インスタンス。

  • ミドルウェア: リクエストのライフサイクル中に実行され、ロギング、認証などのタスクを実行できる関数

Gin フレームワークについては十分です :) 次に、本題に移り、実行されたテストについて話しましょう。

テスト 1 (通常の Docker ビルド)

このテストでは、公式の標準/通常の Go ベース イメージを使用します

# Official Go Base Image
FROM golang:1.21.0

# Create The Application Working Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy Source and Build The Application
COPY . .
RUN go build -o main .

# Expose The Port
EXPOSE 8081
CMD ["./main"]
ログイン後にコピー

画像サイズ

Docker Images for Go (Golang) Small, Faster Docker Images and Security


テスト 2 (Alpine イメージを使用したマルチステージ Docker ビルド)

このテストでは、少し軽量な Go Base Image の Alpine バージョンを使用します

# Official Go Apline Base Image
FROM golang:1.21.0-alpine as builder

# Create The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source & Build
COPY . .
RUN go build -o main .

# Final Image Creation Stage
FROM alpine:3.19

WORKDIR /root/

# Copy The Built Binary
COPY --from=builder /app/main .

# Expose the port
EXPOSE 8081
CMD ["./main"]

ログイン後にコピー

画像サイズ
Docker Images for Go (Golang) Small, Faster Docker Images and Security

ここでは、多段階ビルドによりイメージ サイズが大幅に削減されることがわかります。


テスト 3 (Distroless ビルド)

このテストでは、Google の Distroless Go ベース イメージを使用します。 Distroless イメージは、必要な最小限のファイルのみを含む軽量かつ安全であることで知られています。これにより、これらのデバッグ シェルと不要なパッケージが削除されました。したがって、パッケージ マネージャーとシェルの柔軟性が犠牲になります。

# Build Stage
FROM golang:1.21.0 as builder

# Set The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source and Build the application
COPY . .
RUN CGO_ENABLED=0 go build -o main .

# Final Image Creation Stage
FROM gcr.io/distroless/static-debian12

# Copy the built binary
COPY --from=builder /app/main /
CMD ["/main"]
ログイン後にコピー

画像サイズ
Docker Images for Go (Golang) Small, Faster Docker Images and Security


CGO_ENABLED=0: これは、CGO (C-Go) を無効にする環境変数設定です。 CGO は、Go パッケージで C コードを呼び出すことを可能にする Go の機能です。 CGO_ENABLED=0 を設定すると、ビルドが C ライブラリに依存せず、完全に静的なバイナリが生成されます。これは、追加の依存関係を必要とせずに、任意のシステム上で実行できる軽量でポータブルな Go バイナリを作成する場合に役立ちます。

すべてをまとめると、RUN CGO_ENABLED=0 go build -o main . は、Docker が現在のディレクトリに Go アプリケーションをビルドするコマンドを実行し、main という名前の静的バイナリを生成することを意味します。 C ライブラリに依存します。

まとめ

画像サイズ
Docker Images for Go (Golang) Small, Faster Docker Images and Security

Distroless イメージは Alpine イメージよりわずかに大きいですが、セキュリティの脅威/脆弱性を考慮すると、Distroless! を選択せざるを得なくなる場合があります。したがって、これらすべての事実を考慮して、要件に一致するものを選択してください

Alpine with Multi-Stage Builds は、ビルド プロセスをさらに制御する必要があり、musl libc との互換性の問題が問題にならない場合に適しています。懸念。柔軟性があり、他の多くの基本イメージよりも小さいですが、潜在的なセキュリティの脆弱性/脅威につながる可能性がある Distroless イメージよりも多くのコンポーネントが含まれています。

Google Distroless イメージ は、セキュリティを最大化し、攻撃対象領域を最小限に抑えるのに最適です。これらは非常に最小限のランタイム環境を提供するため、セキュリティが優先される実稼働システムにとって有益です。ただし、パッケージ マネージャーとシェルの柔軟性が犠牲になります。

おすすめ:

ビルド環境の柔軟性と制御が必要で、

musl libc との互換性の問題が問題にならない場合は、Alpine を使用してください。

セキュリティと攻撃対象領域の最小化が最優先事項であり、アプリケーションのすべての依存関係が適切にバンドルされていることを確認できる場合は、

Google Distroless を使用します

面白かったと思います。お時間をいただきありがとうございました!

以上がGo (Golang) 用の Docker イメージ 小型で高速な Docker イメージとセキュリティの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!