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 /app/myapp .
# 10. 開放 8080 Port
EXPOSE 8080
# 11. 設定啟動指令
CMD ["./myapp"]
說明
- 第一階段(builder)
- 使用官方
golang:1.21
作為基礎映像檔。 - 設定工作目錄
/app
,並將程式碼複製到容器中。 - 初始化 Go 模組 (
go mod init mygoapp
),並下載所需的依賴 (go mod tidy
)。 - 使用
CGO_ENABLED=0 go build -o myapp
編譯 Go 應用程式,確保生成靜態執行檔,並設定執行權限 (chmod +x myapp
)。
- 使用官方
- 第二階段(最小化映像檔)
- 使用
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)來減少映像檔大小,使得最終的映像檔更小、更快、更安全,多階段建構是什麼,請看下一篇!🎯