iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
Modern Web

Go,一起成為全端吧!—— 給前端工程師的 Golang 後端學習筆記系列 第 28

Day28 - Docker 部署:讓 To-do List 跑在任何地方

  • 分享至 

  • xImage
  •  

昨天介紹完 Docker 的基本功能之後,今天就要來幫 To-do List 新增 Docker 功能!🙌🙌🙌
把專案包起來,然後試著跑看看~

今日步驟:

  1. 安裝 Docker
  2. 建立 Dockerfile 和 .dockerignore
  3. 建立與測試 docker image
  4. 執行 container 並驗證是否有在運作

1. 安裝 Docker

首先,先安裝符合系統的 Docker 版本,我的電腦是 macOS 系統,找到對應的檔案之後,就下載安裝!
大家可以依照自己的系統下載對應的版本:https://www.docker.com/products/docker-desktop/
安裝完成之後,在 terminal 輸入:

docker -v

如果有看到版本號,表示安裝成功了!
https://ithelp.ithome.com.tw/upload/images/20251012/20178223vgnnzkDbuv.png


2. 建立 Dockerfile 和 .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 套件安裝進去。

3. 建立與測試 docker image

完成 Dockerfile 的內容之後,就可以來打包成 docker image!
在 To-do list 專案底下輸入:

docker build -t to-do-list .

就會開始依照 Dockerfile 的內容打包:
https://ithelp.ithome.com.tw/upload/images/20251012/201782231z0VJj0SUk.png

過程中都沒有出現錯誤,大概機率就是打包成功了!
輸入以下指令,確認是不是已經有 image 檔案:

docker image ls

然後看到這個回傳,就表示已經成功把專案打包成 image 檔案了:

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
to-do-list   latest    97db5ca19aad   11 seconds ago   62.9MB

4. 執行 container 並驗證是否有在運作

最後,我們要來執行剛剛建立的 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:
https://ithelp.ithome.com.tw/upload/images/20251012/20178223eG77CfySw6.png

但如果輸入 docker ps ,發現沒有任何東西的話,也沒關係~
這時候可以輸入:

docker ps -a 

這個指令會顯示 container 的狀態,在 STATUS 這個欄位會有 Exited (數字) 文字,表示在執行 container 之後,有出現一些錯誤,導致沒辦法跑起來,這時候可以輸入這個指令,看一下錯誤訊息:

docker logs to-do-list-container

然後依照顯示的錯誤訊息修正之後,再重新打包、啟動,就可以了唷!


順利跑起來之後,就來打看看 API 吧!

API 的網址是:http://localhost:8080/前面設定的 API 名稱
測試方式:

  • 使用 Postman
  • 使用 terminal
  • 直接在網址上輸入(只能測試 GET 方法)

這邊貼上我從網址輸入的回傳結果:
https://ithelp.ithome.com.tw/upload/images/20251012/20178223ZcO6wejm2p.png

這樣就表示服務有跑成功了! 🎉🎉🎉


上一篇
Day27 - Docker 部署:Docker 是什麼?
下一篇
Day29 - 雲端部署:認識雲端部署
系列文
Go,一起成為全端吧!—— 給前端工程師的 Golang 後端學習筆記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言