code {
font-f
m
有了前後端的映像檔之後,我們需要透過 Docker Compose 將所有服務黏合在一起。在這裡,我們加入了 PostgreSQL 與 Redis。為了讓資料庫資料不因容器重啟而消失,我們善用 Volume (卷軸) 來進行持久化儲存。同時,為了安全性,我們可以利用內建的 Docker 網路來隔離服務,讓資料庫不對外公開連接埠,僅允許後端容器存取。
重點提示: 在上述設定中,我們使用了 condition: service_healthy 來確保後端容器會等待資料庫成功啟動並通過健康檢查後,才開始啟動。這種「依賴宣告」是 2026 年撰寫 Compose 檔案的精髓,避免了因服務啟動順序錯誤而導致的連線失敗。
設定完成後,我們只需執行 docker compose up -d --build,Docker 就會開始建置映像檔並啟動所有服務。當終端機出現「Started」字樣後,透過瀏覽器連接到 http://localhost:8080,你就能親眼看到你的應用程式成功運行在容器中了!這就是容器化帶來的無縫開發體驗。
當我們的應用程式在單一主機上運行順利後,下一個挑戰便是:如何應對爆量的請求?如何確保服務不間斷?如何在主機故障時自動恢復?這些問題,便是 Kubernetes (簡稱 K8s) 登場的時機。K8s 是一個開源的容器編排平台,用來自動化容器的部署、擴展和管理。
單機 Docker Compose 僅限於「單一主機」進行管理。如果主機掛了,整個服務就毀了。而 Kubernetes 的核心價值在於「叢集(Cluster)」管理。我們可以將多台伺服器(Node)組成一個叢集,K8s 會負責將我們的容器(Pod)調度到合適的節點上運行。
假設我們的服務有 3 個 Pod 實例在運行。當某一個節點因故離線時,K8s 的 Controller Manager 會自動偵測到節點異常,並在其他健康的節點上重新建立 Pod,確保服務的副本數(Replicas)始終維持在我們設定的數量。這就是 K8s 所提供的「自我修復」能力,也是它成為容器編排霸主的主要原因。
要讓 K8s 能夠下載我們的 Docker 映像檔,我們必須先將映像檔推送到一個「容器倉庫(Registry)」,例如 Docker Hub 或雲端平台提供的私有倉庫(如 AWS ECR、GCR、ACR)。首先,先為我們的映像檔打上標籤,然後推送:
docker tag yabaoblog-backend:latest ghcr.io/yourname/yabaoblog-backend:v1.0.0
docker push ghcr.io/yourname/yabaoblog-backend:v1.0.0
小提醒: 在正式團隊協作中,通常會結合 CI/CD 流程(如 GitHub Actions),在程式碼合併到主分支時,自動觸發建置並推送全新的映像檔。這樣可以確保每一位開發者部署的版本都有一致的來源與可追溯性。
接下來,是整個指南的重頭戲:將我們的容器部署到 K8s 叢集。K8s 的操作核心是透過 YAML 定義檔與 API Server 溝通。以 Deployment 為例,它定義了應用程式的「期望狀態」,包含映像檔來源、副本數量、資源限制等。而 Service 則定義了如何對外暴露這些 Pod。
接著,建立一個 Service 來允許叢集內部或外部的流量訪問這些 Pod。如果是對外服務,通常會搭配 LoadBalancer 或 Ingress Controller:
將上述檔案儲存後,我們只需執行 kubectl apply -f deployment.yaml -f service.yaml,K8s 就會立即開始建立 Pod 並進行調度。透過 kubectl get pods,我們可以觀察 Pod 的啟動狀態;透過 kubectl get svc,我們可以看到 K8s 分配給我們的對外 IP。至此,我們的應用程式已經具備了企業級的橫向擴展能力與高可用性,這是單純使用 Docker Docker Compose 無法達到的境界。
當你熟悉了 Docker 和 K8s 的基本整合後,想要在職場上具備更強的競爭力,就必須開始關注容器生態圈的進階議題。2026 年,我們特別聚焦在「安全」與「可觀測性」這兩個領域。
過去,我們看到太多因 Dockerfile 撰寫不良而導致的資安漏洞。例如,直接使用 root 使用者運行應用程式,或是在映像檔中不小心留下了敏感憑證。在 2026 年的最佳實務中,這件事絕對不可妥協。
docker scan 或 Trivy 等工具,確保推送到倉庫的映像檔沒有已知的高風險 CVE。除了把服務部署起來,我們還需要隨時掌握服務的健康狀況。在 K8s 環境中,Prometheus 已成為監控資料收集的事實標準。你的應用程式只需要在 `/metrics` 路徑暴露符合 Prometheus 格式的指標,Prometheus 就會定期來抓取(Scrape)。
同時,追蹤系統也越來越重要。透過 OpenTelemetry 標準,我們可以在應用程式中輕鬆地植入分散式追蹤(Distributed Tracing),將一個請求從前端到後端、再到資料庫的完整路徑串聯起來。這對於微服務架構的效能調校與問題排查來說,絕對是不可或缺的工具。
利用 Docker 的 HOST 網路模式或 K8s 的 Pod 網路,可以方便地讓各服務與 Prometheus 等監控元件連通。筆者強烈建議各位要親手部署一次 Grafana + Prometheus 到 K8s 叢集中,親眼看到監控告警面板上的數據流動,才能真正理解 Log(日誌)、Metrics(指標)、Traces(追蹤)三者的相輔相成。
不知不覺,我們已經從 Docker 的基礎概念,一路走到與 Kubernetes 整合的應用層次。回顧這段旅程,我們不僅學會了如何撰寫 Dockerfile、使用 docker-compose 管理多容器環境,更深入了解如何利用 K8s 打造高可用性的叢集架構。
學習容器化不該是死背指令,而是要理解背後要解決的問題。在雅寶社群中,筆者最喜歡看到的就是成員們分享自己的實作經驗。無論是你踩到了什麼雷,或是想出了一個超棒的解法,歡迎大家踴躍在底下留言討論。將知識分享出去,不僅能幫助他人,也能強化自己的理解。
對於剛入門的朋友,建議可以先從 Docker Desktop 開始,將日常開發環境容器化,感受一致的開發體驗。熟悉之後,再嘗試在自己的電腦上建立單節點的 Minikube 或 Kind 叢集,將今天所學的 Deployment 與 Service 實際執行一遍。這條路徑雖然不算輕鬆,但只要持續刻意練習,很快就能收到甜美的果實。
最後,隨著 AI 與邊緣運算的興起,容器技術的應用場景也變得更加多元。但請記住,無論底層技術如何演進,「標準化、自動化、可移植性」的容器核心精神恆久不變。期待在未來的文章或討論中,看到大家在雅寶社區內分享更多關於 Docker / K8s 的豐碩成果!祝大家部署順利,系統永遠穩定運行!
本文同步發布於雅寶社區 · 頂客論壇 #3C 科技教學版
```
歡迎在下方留言,分享您的想法、心得或疑問。所有留言都會透過 GitHub 帳號 進行驗證。