首頁 >後端開發 >Golang >透過多階段建立 Docker 化您的 Go API

透過多階段建立 Docker 化您的 Go API

Barbara Streisand
Barbara Streisand原創
2024-10-08 06:30:021105瀏覽

Dockerizing Your Go API with Multi-Stage Builds

好吧,團隊!我們透過Docker化它,將我們的Go API提升到一個新的水平,更重要的是,透過多階段建置使其輕量級且有效率。讀完本文後,您將擁有一個不僅可移植而且還針對更快部署進行最佳化的 API。 ?

為什麼要進行多階段建構? ?

多階段建置使我們能夠透過將建置環境與運行時環境分離來保持最終的Docker映像的精簡。對於 Go 應用程式來說,這特別有用,因為我們可以在一個階段(使用所有必要的工具和依賴項)建立應用程序,然後僅將生成的二進位檔案複製到更小的最終映像中。

多階段建構的好處

  • 較小的圖像大小:透過剝離不必要的構建依賴項,我們最終得到的圖像只是大小的一小部分。
  • 更快的部署:較小的映像意味著更快的下載和部署。
  • 減少攻擊面:執行環境中的元件越少,代表潛在的漏洞就越少。

第 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 Alpine 鏡像開始,它比標準 Go 鏡像小。
    • 所有依賴項都已下載,然後我們使用 go build 將應用程式編譯為二進位(主)。
  2. 運行時階段:

    • 我們切換到更輕的 Alpine 鏡像,它不包含 Go 編譯器或其他建置依賴項。
    • 編譯後的二進位檔案是從建構器階段複製過來的,我們公開連接埠 8000 以允許存取我們的 API。

透過這種方法,我們的最終圖像僅包含運行 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: 使用暫存影像進一步優化(可選)

為了進一步最佳化,您可以使用scratch 映像取代 Alpine 執行階段。臨時映像完全是空的——沒有作業系統,沒有實用程式——這導致映像尺寸更小。但是,這也意味著您將無法存取容器內的任何偵錯工具。

這是帶有 scratch 映像的 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!但是,請記住,使用 scrap 最適合非常基本的獨立應用程式。


第 4 步:測試優化後的容器?

讓我們測試我們的容器以確保它按預期工作:


curl http://localhost:8000/books


如果您的 API 回應正確,那麼恭喜!您已成功使用 Docker 優化並容器化了您的 Go API。 ?

生產中多階段建構的好處

  • 高效部署:較小的鏡像意味著更快的拉取時間,這在生產環境中至關重要。
  • 節省資源:透過減少儲存和記憶體佔用,您的基礎設施成本保持較低。
  • 安全性:最終映像中較少的組件減少了潛在的漏洞。

接下來是什麼?

現在您的 API 已支援 Docker 並針對生產進行了最佳化,您已經做好了順利部署和擴展的準備!下次,我們將換檔並深入研究 Go 的單元測試,確保您的 API 不僅可部署,而且堅如磐石。 ??

此外,請關注我的 ThrottleX GitHub 存儲庫以獲取更新 - 我很快就會發布有關集成自訂速率限制器的教程!

以上是透過多階段建立 Docker 化您的 Go API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn