Docker CLI
每天真正會打的指令都在這。以 Docker 官方 CLI 參考為準(截至 2026-06)。觀念基礎見 核心概念。
容器生命週期
| 指令 | 用途 | 範例 |
|---|
docker run | 從映像建立並啟動新容器 | docker run -d --name web nginx:alpine |
docker start | 啟動已停止的容器 | docker start web |
docker stop | 送 SIGTERM 優雅停止(預設等 10 秒寬限期) | docker stop web |
docker restart | 停止後重新啟動 | docker restart web |
docker pause / unpause | 凍結 / 解凍容器內所有行程 | docker pause web |
docker rm | 刪除已停止的容器(-f 強制刪執行中) | docker rm web |
docker run -d --name web nginx:alpine # 建立並背景啟動
docker stop -t 0 web # 不等 SIGTERM 直接停
docker rm -f web # 強制刪除執行中的容器
docker run 重要旗標
旗標決定容器怎麼跑,這些最常用:
| 旗標 | 用途 | 範例 |
|---|
-d | 背景執行(detached),只印 container ID | docker run -d nginx:alpine |
-it | 互動式 shell(-i 保留 STDIN、-t 配 TTY) | docker run -it ubuntu bash |
--name | 指定容器名稱(同一主機須唯一) | docker run --name web nginx |
--rm | 容器結束後自動刪除(含匿名 volume) | docker run --rm alpine echo hi |
-p | 發布埠,格式 主機:容器 | docker run -p 8080:80 nginx |
--network | 連到指定網路 | docker run --network mynet app |
-v / --mount | 掛載 volume 或 bind mount | docker run -v data:/app/data app |
-e / --env-file | 設環境變數 / 從檔案讀 | docker run -e TZ=Asia/Taipei app |
--restart | 重啟策略(見下) | docker run --restart=always nginx |
--gpus | 傳入 GPU(需 NVIDIA Container Toolkit) | docker run --gpus all app nvidia-smi |
-w / -u | 工作目錄 / 執行身分 | docker run -w /app -u 1000:1000 app |
--memory / --cpus | 資源上限 | docker run -m 512m --cpus 1.5 app |
--restart 四種策略:
| 值 | 行為 |
|---|
no(預設) | 不自動重啟 |
on-failure[:N] | 只有非零退出碼才重啟,可設最多重試 N 次 |
always | 一律重啟,daemon 重啟後也拉起來 |
unless-stopped | 同 always,但你手動 docker stop 後,daemon 重啟不會自動拉起 |
-p 的方向是 主機:容器,左邊是你的電腦、右邊是容器內部。-p 8080:80 是「主機 8080 轉進容器 80」,寫反了會連不到。只開給本機可加 host IP:-p 127.0.0.1:8080:80。
查看與除錯
| 指令 | 用途 |
|---|
docker ps | 列出執行中容器(-a 含已停止、-q 只印 ID) |
docker logs | 看容器日誌(-f 即時、--tail N、--since) |
docker exec | 在執行中的容器裡跑指令(-it 進互動 shell) |
docker inspect | 看容器 / 映像完整 JSON(IP、掛載、環境變數) |
docker stats | 即時看 CPU / 記憶體 / 網路 / Block I/O |
docker top | 看容器內執行中的行程 |
docker cp | 在容器與主機之間複製檔案 |
docker ps -a -q --filter status=exited # 所有已停止容器的 ID
docker logs -f --tail 100 web # 即時看最後 100 行
docker exec -it -u root web bash # 以 root 進互動 shell
docker inspect --format='{{.NetworkSettings.IPAddress}}' web # 取容器 IP
docker stats --no-stream # 取一次快照不持續串流
docker cp web:/app/logs/app.log ./app.log # 容器檔案複製到主機
一個「跑起來、看狀態、進去看、收掉」的流程跑出來長這樣:
映像檔指令
| 指令 | 用途 |
|---|
docker images | 列出本機所有映像(-a 含中間層) |
docker pull | 從 registry 拉映像 |
docker build | 從 Dockerfile 建映像(-t 命名、-f 指定檔) |
docker tag | 替映像加新 tag |
docker rmi | 刪除映像(-f 強制) |
docker history | 看映像每層的建置指令與大小 |
docker save / load | 匯出成 tar / 匯入(離線搬運) |
docker pull nginx:1.27-alpine
docker build -f docker/Dockerfile.prod -t myapp:prod .
docker tag myapp:1.0 user/myapp:1.0
docker save myapp:1.0 | gzip > myapp.tar.gz # 壓縮匯出
docker load < myapp.tar.gz # 匯入
docker build 的完整用法在 從零搭建 Dockerfile。
清理指令
映像、容器、volume 會越積越多。這組指令有破壞性,分清楚各自清什麼:
docker system df # 先看磁碟用量與可回收量
docker system df -v # 每個物件的細項
docker container prune # 清所有已停止容器
docker image prune # 只清懸空(dangling)映像
docker image prune -a # 連所有沒被容器引用的映像(含 tag)
docker volume prune # 只清匿名 volume
docker network prune # 清未使用的自訂網路
docker system prune # 停止容器 + 未用網路 + dangling 映像 + build cache
docker system prune -a # 映像擴大到「所有沒被容器引用的」
docker system prune -a --volumes # 再加匿名 volume,破壞性最強
清理不可逆,下手前先 docker system df:
docker image prune -a / system prune -a 會刪所有沒被容器使用的映像,包括你之後還想用的版本,得重新 pull。
--volumes 只清匿名 volume;要清具名 volume(資料庫資料常在這)得用 docker volume prune -a,資料無法復原。
- 系統內建的
bridge / host / none 網路永遠不會被 prune。
多 daemon 與診斷
docker context ls # 列出可連線的 Docker daemon
docker context create remote --docker "host=ssh://user@10.0.0.5"
docker --context remote ps # 對遠端 daemon 跑單一指令
docker version # client 與 daemon 版本、API 版本
docker info # 整個安裝的系統資訊
已棄用項目(截至 2026-06)
| 舊用法 | 現狀 | 取代 |
|---|
docker-compose(v1,Python) | 已 EOL、不再維護 | docker compose(v2,內建 CLI plugin) |
docker run --link | 已棄用 | user-defined network + DNS 名稱解析 |
DOCKER_BUILDKIT=0 | 可停 BuildKit 但不建議 | 直接用 BuildKit(Docker 23+ 預設) |
接下來
官方參考:docs.docker.com/reference/cli/docker