跳至主要内容

Dockerfile

現在,我們學會了如何使用 Docker 映像檔與容器,接下來,我們要學習如何建立自己的 Dockerfile,來製作專屬的 Docker 映像檔。


什麼是 Dockerfile?

Dockerfile 是一個純文字文件,內含一系列指令(命令),用來自動化構建 Docker 映像檔。 當我們執行 docker build 時,Docker 會根據這個文件的內容,逐步建立映像檔。

Dockerfile 基本結構

# 選擇基礎映像檔
FROM <基礎映像檔>

# 設定維護者資訊(可選)
LABEL maintainer="<你的名字或 Email>"

# 設定工作目錄
WORKDIR /app

# 複製檔案到容器
COPY . /app

# 安裝必要的軟體(例如 Python、Node.js)
RUN <安裝指令>

# 設定環境變數(可選)
ENV <變數名稱> <值>

# 設定對外開放的 Port
EXPOSE <Port 號碼>

# 設定啟動指令
CMD ["<指令>", "<參數1>", "<參數2>"]

建立一個簡單的 Dockerfile

1. 建立專案資料夾

首先,建立一個資料夾,例如 mygoapp

mkdir mygoapp && cd mygoapp

2. 建立 main.go

mygoapp 資料夾內,建立一個 main.go 檔案:

package main

import (
"fmt"
"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Docker with Golang!")
}

func main() {
http.HandleFunc("/", handler)
fmt.Println("Server is running on port 8080...")
http.ListenAndServe(":8080", nil)
}

這是一個簡單的 HTTP 伺服器,監聽 8080 Port,並返回 "Hello, Docker with Golang!"

3. 撰寫 Dockerfile

mygoapp 資料夾內,建立一個 Dockerfile

# 1. 使用官方 Golang 映像檔作為基礎
FROM golang:1.21 AS builder

# 2. 設定工作目錄
WORKDIR /app

# 3. 複製所有程式碼
COPY . .

# 4. 初始化 Go 模組(如果沒有 go.mod)
RUN go mod init mygoapp && go mod tidy

# 5. 編譯 Go 應用程式(靜態執行檔)
RUN CGO_ENABLED=0 go build -o myapp && chmod +x myapp

# 6. 建立最小化的映像檔(使用小型 Alpine Linux)
FROM alpine:latest

# 7. 安裝必要的函式庫
RUN apk --no-cache add ca-certificates

# 8. 設定工作目錄
WORKDIR /root/

# 9. 複製已編譯的 Go 執行檔
COPY --from=builder /app/myapp .

# 10. 開放 8080 Port
EXPOSE 8080

# 11. 設定啟動指令
CMD ["./myapp"]

說明

  1. 第一階段(builder)
    • 使用官方 golang:1.21 作為基礎映像檔。
    • 設定工作目錄 /app,並將程式碼複製到容器中。
    • 初始化 Go 模組 (go mod init mygoapp),並下載所需的依賴 (go mod tidy)。
    • 使用 CGO_ENABLED=0 go build -o myapp 編譯 Go 應用程式,確保生成靜態執行檔,並設定執行權限 (chmod +x myapp)。
  2. 第二階段(最小化映像檔)
    • 使用 alpine:latest 作為基礎映像檔,這是一個極小型的 Linux 環境,適合輕量級部署。
    • 安裝 ca-certificates 以支援 HTTPS 連線(視應用需求)。
    • 設定工作目錄 /root/,並將編譯後的 myapp 複製到容器中。
    • 開放 8080 端口供外部存取應用程式。
    • 設定 CMD ["./myapp"] 讓容器啟動時自動執行應用程式。

4. 建立並執行 Docker 映像檔

建構映像檔

執行以下指令,建立名為 mygoapp 的 Docker 映像檔:

docker build -t mygoapp .

成功後,你會看到類似:

Successfully built abc123456def
Successfully tagged mygoapp:latest

執行容器

docker run -d -p 8080:8080 --name goapp mygoapp
  • -d:背景執行
  • -p 8080:8080:將主機的 8080 Port 對應到容器的 8080 Port
  • --name goapp:指定容器名稱為 goapp
  • mygoapp:使用我們剛剛建立的映像檔

5. 測試 Go 應用程式

打開瀏覽器,輸入:

http://localhost:8080

你應該會看到:

Hello, Docker with Golang!

🎉 恭喜!你成功將 Golang 應用程式打包成 Docker 容器!🚀

6. 刪除容器與映像檔(清理環境)

停止並刪除容器

docker stop goapp
docker rm goapp

刪除映像檔

docker rmi mygoapp

總結

指令功能
FROM指定基礎映像檔
WORKDIR設定工作目錄
COPY複製檔案到容器
RUN執行指令(例如 go build
EXPOSE開放 Port
CMD設定容器啟動時執行的指令

這次我們還使用了多階段構建(Multi-Stage Build)來減少映像檔大小,使得最終的映像檔更小、更快、更安全,多階段建構是什麼,請看下一篇!🎯