2.1 容器生命週期控制#
一個容器的生與死#
容器有明確的生命週期:建立 → 執行 → 停止 → 刪除。掌握本節的幾個指令,就能完全掌控容器的生與死。
flowchart LR
I[Image] -->|docker run| R[Running 執行中]
R -->|docker stop| S[Stopped 已停止]
S -->|docker start| R
S -->|docker rm| X[已刪除<br/>可寫層消失]
R -->|docker rm -f| X啟動與執行:docker run#
docker run 是最核心的指令,本地沒有 Image 時會自動 pull:
# 基本執行(前景):輸出直接印在終端機,按 Ctrl+C 停止
docker run hello-world
# 背景執行(-d = detached):容器在背景跑,回傳容器 ID
docker run -d nginx
# 常用組合:背景執行 + 埠對映 + 指定名稱
docker run -d -p 8080:80 --name my-nginx nginx
| 選項 | 意義 |
|---|---|
-d | 背景執行(detached),終端機可以繼續做事 |
--name | 給容器取名字,之後不用記容器 ID |
--rm | 容器停止後自動刪除(適合一次性任務) |
-p 8080:80 | 埠對映(下一節詳述) |
-e KEY=value | 設定環境變數 |
初學者常見困惑:
docker run nginx沒加-d時「卡住了」。其實不是卡住,是 Nginx 在前景執行、輸出印在你的終端機上。按Ctrl+C會停止容器。伺服器類程式幾乎都要加-d。
查看狀態:docker ps#
# 只顯示執行中的容器
docker ps
# 顯示所有容器(含已停止的)——最常用的排查指令
docker ps -a
輸出欄位的重點:
- CONTAINER ID:容器唯一 ID(短版),操作時通常寫前幾碼就夠
- STATUS:
Up 5 minutes(執行中)或Exited (0) 2 minutes ago(已停止,0 表示正常結束) - NAMES:容器名稱,沒指定時 Docker 會隨機取一個有趣的名字(如
angry_beaver)
停止、啟動與刪除#
docker stop my-nginx # 優雅停止(先送 SIGTERM,10 秒後強制)
docker start my-nginx # 重新啟動已停止的容器(設定保留)
docker restart my-nginx # 重啟執行中的容器
docker rm my-nginx # 刪除容器(必須是停止狀態)
docker rm -f my-nginx # 強制刪除(連執行中的也刪)
重要觀念(複習 1.2 節):
docker stop只是停止執行,容器還在,docker start可以恢復,所有設定保留docker rm才是真的刪除,容器內的資料(可寫層)隨之消失- Image 不受影響——刪除容器後還可以再用同一個 Image 啟動新容器
一次性任務的慣用法#
跑完就丟的任務(測試、腳本、臨時工具),加上 --rm 讓 Docker 自動清理:
# 用 Python 3.12 執行一段程式碼,結束後容器自動刪除
docker run --rm python:3.12 python -c "print('hello')"
# 臨時進入一個 Alpine Linux 玩一玩
docker run --rm -it alpine sh
這是容器比傳統安裝乾淨的關鍵:用完即丟,不留痕跡。
本章小結#
- 生命週期:建立 → 執行 → 停止 → 刪除
docker run:啟動;-d背景執行、--name命名、--rm用完即刪docker ps看執行中,docker ps -a看全部(排查必用)stop停止但容器還在,rm才是真的刪除(資料消失)- 一次性任務:
docker run --rm -it <image> <command>
想一想#
docker run nginx沒加-d時終端機「卡住」,實際上發生了什麼事?docker stop之後再docker start,容器內你手動改過的檔案還在嗎?為什麼?- 為什麼一次性任務建議加
--rm?如果不加,會累積什麼問題?