昨天介紹完 Docker 的基本功能之後,今天就要來幫 To-do List 新增 Docker 功能!🙌🙌🙌
把專案包起來,然後試著跑看看~
今日步驟:
.dockerignore
首先,先安裝符合系統的 Docker 版本,我的電腦是 macOS 系統,找到對應的檔案之後,就下載安裝!
大家可以依照自己的系統下載對應的版本:https://www.docker.com/products/docker-desktop/
安裝完成之後,在 terminal 輸入:
docker -v
如果有看到版本號,表示安裝成功了!
.dockerignore
再來就要開始撰寫 Dockerfile!
Dockerfile 是一份指令腳本,它定義「 如何把專案打包成 Docker image 」!
→ 就是一份專案說明書的概念!(詳細介紹可以參考 Day 27 唷!🙌)
那 .dockerignore
又是什麼?
它的作用跟 .gitignore
檔案一樣,在打包 docker 的時候,有一些檔案是不希望被打包進去的,所以就要把這些檔案註記在 .dockerignore
裡面。
接下來,就要來實作了!
我們要建立一個 Docker 和 .dockerignore
檔案,放在 To-do List 專案中根目錄的位置:
TO-DO-LIST
|- app
|- .gitignore
|- .dockerignore
|- Dockerfile
|- LICENCE
|- README.md
.dockerignore
內容:
# 不要放進 Docker Image 的檔案
.git
.gitignore
Dockerfile
docker-compose.yml
README.md
*.log
node_modules
tmp
dist
.env
.env
打包唷!不然就失去了環境變數的意義~Dockerfile 內容:
# 第一階段:建置階段 (Build Stage),安裝 go
FROM golang:1.25 AS builder
# 設定容器內的工作目錄
WORKDIR /app
# 複製 go.mod 和 go.sum,安裝套件
COPY app/go.mod app/go.sum ./
RUN go mod download
# 複製專案中所有程式碼到容器中
COPY app/ .
# 編譯 Go 程式成執行檔,並命名為 todolist
ENV CGO_ENABLED=1
RUN go build -o todolist .
# 第二階段:執行階段 (Run Stage)
FROM debian:bookworm-slim
# 設定容器內的工作目錄
WORKDIR /app
# 安裝 sqlite 套件
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
# 複製執行檔
COPY --from=builder /app/tasks.db .
COPY --from=builder /app/todolist .
EXPOSE 8080
# 設定容器啟動時執行的指令
CMD ["./todolist"]
FROM alpine:latest
,但是在執行的時候出現錯誤,發現 alpine 沒有 glibc
(編譯方式不一樣),導致無法執行。所以才改用:FROM debian:bookworm-slim
。然後再把 sqlite 套件安裝進去。完成 Dockerfile 的內容之後,就可以來打包成 docker image!
在 To-do list 專案底下輸入:
docker build -t to-do-list .
就會開始依照 Dockerfile 的內容打包:
過程中都沒有出現錯誤,大概機率就是打包成功了!
輸入以下指令,確認是不是已經有 image 檔案:
docker image ls
然後看到這個回傳,就表示已經成功把專案打包成 image 檔案了:
REPOSITORY TAG IMAGE ID CREATED SIZE
to-do-list latest 97db5ca19aad 11 seconds ago 62.9MB
最後,我們要來執行剛剛建立的 image 檔案!
輸入:
docker run -d --name to-do-list-container --env-file ./app/.env -p 8080:8080 to-do-list
說明:
-d
:讓 container 在背景執行。--name to-do-list-container
:幫 container 命名,方便管理。--env-file ./app/.env
:對應環境變數 .env
檔案的位置。-p 8080:8080
:把主機的 8080 port 對應 container 的 8080 port。to-do-list
:剛剛建立的 image 名稱。然後,來確認一下執行之後有沒有在跑,輸入:
docker ps
如果回傳有出現東西,表示有成功起起來:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87d70372aead to-do-list "./todolist" 7 seconds ago Up 7 seconds 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp to-do-list-container
也可以到一開始下載的 Docker desktop,這裡也會出現你建立的 container:
但如果輸入 docker ps
,發現沒有任何東西的話,也沒關係~
這時候可以輸入:
docker ps -a
這個指令會顯示 container 的狀態,在 STATUS 這個欄位會有 Exited (數字)
文字,表示在執行 container 之後,有出現一些錯誤,導致沒辦法跑起來,這時候可以輸入這個指令,看一下錯誤訊息:
docker logs to-do-list-container
然後依照顯示的錯誤訊息修正之後,再重新打包、啟動,就可以了唷!
API 的網址是:http://localhost:8080/前面設定的 API 名稱
測試方式:
GET
方法)這邊貼上我從網址輸入的回傳結果:
這樣就表示服務有跑成功了! 🎉🎉🎉