Docker 容器 (Containers) 生命周期管理

在理解了映像檔是靜態的藍圖之後,我們現在要專注於它的執行個體:容器 (Container)

容器並非只是「縮小版的虛擬機」,它的行為更接近於一個帶有隔離環境的「進程 (Process)」。本章將詳細探討容器的各種狀態、進階啟動參數以及如何監控容器。

容器的六種狀態 (States)

一個容器從誕生到消亡,通常會經歷以下狀態:

  1. Created (已建立):使用 docker create 建立了容器,但尚未啟動。
  2. Running (執行中):最常見的狀態,程式正在容器內運作。
  3. Paused (已暫停):容器內的進程被掛起,不佔用 CPU 資源,但保留記憶體狀態。
  4. Restarting (重啟中):容器正在嘗試自動重新啟動。
  5. Exited (已停止):主進程結束或被手動停止。
  6. Dead (已失效):通常是因為嚴重的系統錯誤或資源爭用,導致容器無法刪除或運行。

進階 docker run 操作

我們在常用指令篇學過 docker run,現在來看看幾個讓容器管理更專業的參數:

自動重啟政策 (--restart)

在生產環境中,我們希望容器如果崩潰能自動重啟:

  • no: 預設值,不重啟。
  • always: 無論什麼原因停止(手動停止除外),都會重啟;系統開機也會自動啟動。
  • unless-stopped: 類似 always,但如果手動停止後,重開機就不會自動啟動。
  • on-failure: 只有在程式回傳非零退出碼(出錯)時才重啟。
docker run -d --restart always nginx

拋棄式容器 (--rm)

如果你只想做一次性的實驗或測試,不希望留下垃圾,請使用 --rm

# 執行完後自動刪除容器
docker run --rm alpine echo "Hello World"

指定主機名稱 (--hostname)

你可以設定容器內部的網路識別名稱:

docker run -d --hostname web-server nginx

進入容器的不同方式

有時候我們需要進去容器看看設定檔或報錯資訊,有兩種主要方式:

互動式啟動 (-it)

在啟動時直接「附著」上去:

docker run -it ubuntu bash
互動模式與背景執行的切換
如果你在互動模式下想離開但不停止容器,可以按下 Ctrl + P, 接著按 Ctrl + Q。 如果你想再次連回背景容器的終端機,可以使用 docker attach [ID]

進去已經在執行的容器 (exec)

這最常用於維護運作中服務:

docker exec -it my-nginx bash
使用 docker exec 進入容器後,輸入 exit 或按下 Ctrl + D 即可退出終端機,這不會導致原本正在執行的容器停止。

監控容器效能與狀態

當你的電腦跑了十幾個容器,想知道誰最吃正源時可以使用:

即時資源監測 (stats)

類似 Linux 的 top,可以看到 CPU、記憶體、網路 IO。

docker stats

檢視進程 (top)

查看特定容器內部正在跑哪些 Linux Process:

docker top my-nginx

容器健康檢查 (Health Check)

有時候容器是「Running」狀態,但內部的 Web Server 可能已經卡死或連不到資料庫。Docker 支援自定義健康檢查:

docker run -d \
  --name my-app \
  --health-cmd "curl -f http://localhost/ || exit 1" \
  --health-interval 5s \
  --health-retries 3 \
  nginx

執行後,使用 docker ps 你會在 STATUS 欄位看到 (healthy)(unhealthy)。這對於實踐自動修復機制非常重要。

總結

容器的靈活性來自於它的「輕量」與「可預測性」。記得:容器應該是隨時可以被刪除與取代的 (Ephemeral),不要在容器層存儲重要的數據。