Docker 容器 (Containers) 生命周期管理
在理解了映像檔是靜態的藍圖之後,我們現在要專注於它的執行個體:容器 (Container)。
容器並非只是「縮小版的虛擬機」,它的行為更接近於一個帶有隔離環境的「進程 (Process)」。本章將詳細探討容器的各種狀態、進階啟動參數以及如何監控容器。
容器的六種狀態 (States)
一個容器從誕生到消亡,通常會經歷以下狀態:
- Created (已建立):使用
docker create建立了容器,但尚未啟動。 - Running (執行中):最常見的狀態,程式正在容器內運作。
- Paused (已暫停):容器內的進程被掛起,不佔用 CPU 資源,但保留記憶體狀態。
- Restarting (重啟中):容器正在嘗試自動重新啟動。
- Exited (已停止):主進程結束或被手動停止。
- 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),不要在容器層存儲重要的數據。