🐳 Docker
Docker 是一個用於在隔離容器中執行應用程式的平台。本速查表包含操作映像檔、容器、網路、卷,以及 Docker Compose 與 Swarm 的指令。
📦 基本指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker | 主要的 Docker CLI 指令,用於執行子指令並管理容器、映像檔、網路與卷 | |
| docker version | 顯示已安裝的 Docker 版本(用戶端與伺服器)。常用於驗證安裝 | |
| docker version --format '{{.Client.APIVersion}}' | 僅顯示 Docker 用戶端 API 版本 | |
| docker version --format '{{.Server.Version}}' | 僅顯示 Docker 伺服器 (Engine) 版本 | |
| docker version --format '{{json .}}' | 以 JSON 格式輸出完整版本資訊 | |
| docker system info | 顯示 Docker 系統資訊:容器數量、映像檔、資源 | |
| docker info | 顯示 Docker 數據:版本、網路、容器和映像檔數量 | |
| docker info --format '{{json .}}' | 以 JSON 格式輸出資訊 — 適合自動化 | |
| docker info --format '{{.NCPU}} CPUs, {{.MemTotal}} bytes RAM' | 顯示 CPU 數量與總記憶體 | |
| docker info --format '{{.Driver}}' | 顯示 Docker 使用的存儲驅動 | |
| docker image pull | 從 Docker Hub 或其他登錄伺服器下載映像檔。容器必須依賴映像檔才能執行 | |
| docker pull ubuntu | 下載最新的 Ubuntu 映像檔 | |
| docker pull nginx:alpine | 下載基於 Alpine Linux 的輕量級 Nginx 映像檔 | |
| docker pull redis:7 | 下載 Redis 7 版本映像檔 | |
| docker container run | 從映像檔建立並執行新容器 | |
| docker run -it ubuntu bash | 以互動式 Bash 終端執行 Ubuntu | |
| docker run -d nginx | 在背景模式下執行 Nginx | |
| docker run -p 8080:80 nginx | 執行 Nginx 並將容器埠 80 綁定到主機埠 8080 | |
| docker container ls | 列出正在執行的容器 | |
| docker ps | 僅顯示正在運行的容器 | |
| docker ps -a | 顯示所有容器,包括已停止的 | |
| docker ps --format '{{.Names}}' | 僅輸出容器名稱 | |
| docker container start | 啟動一個或多個已停止的容器 | |
| docker start container_name | 依名稱啟動容器 | |
| docker start $(docker ps -aq) | 啟動所有容器 | |
| docker start -ai container_name | 啟動容器並附加互動式終端 | |
| docker container stop | 停止正在執行的容器 | |
| docker stop container_name | 依名稱停止容器 | |
| docker stop $(docker ps -q) | 停止所有正在執行的容器 | |
| docker stop -t 5 container_name | 給容器 5 秒完成程序後停止 | |
| docker container restart | 重新啟動容器 | |
| docker restart container_name | 重啟指定容器 | |
| docker restart $(docker ps -q) | 重啟所有正在執行的容器 | |
| docker restart -t 10 container_name | 延遲 10 秒後重啟容器 | |
| docker container rm | 刪除容器 | |
| docker rm container_name | 刪除指定的已停止容器 | |
| docker rm $(docker ps -aq) | 刪除所有已停止容器 | |
| docker rm -f container_name | 強制刪除正在執行的容器 | |
| docker image ls | 列出已下載的映像檔 | |
| docker images | 顯示主機上的所有映像檔 | |
| docker images -a | 顯示所有映像檔,包括中間層 | |
| docker images --format '{{.Repository}}:{{.Tag}}' | 僅輸出映像檔名稱與標籤 | |
| docker image rm | 從本地存儲刪除一個或多個映像檔 | |
| docker rmi test1:latest | 刪除  | |
| docker rmi 1a2b3c4d5e6f | 依 ID 刪除映像檔 | |
| docker rmi $(docker images -q) | 刪除所有映像檔(使用時需小心!) | 
🔁 容器管理
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker container exec | 在正在執行的容器內運行指令 | |
| docker exec -it container bash | 在名為  | |
| docker exec container ls /app | 在容器的  | |
| docker exec -d container touch /tmp/testfile | 在容器中以背景模式執行指令(不等待) | |
| docker container logs | 查看容器日誌 | |
| docker logs container | 顯示容器  | |
| docker logs -f container | 即時跟隨容器日誌 | |
| docker logs --tail 50 container | 顯示最後 50 行日誌 | |
| docker inspect | 檢索容器或映像檔的詳細 JSON 資訊 | |
| docker inspect container | 顯示容器  | |
| docker inspect --format '{{.NetworkSettings.IPAddress}}' container | 顯示容器的 IP 地址 | |
| docker container stats | 顯示容器的即時資源使用統計 | |
| docker stats | 顯示所有容器的 CPU、記憶體、網路和磁碟用量 | |
| docker stats container_name | 僅顯示指定容器的統計 | |
| docker stats --no-stream | 顯示一次性統計快照後退出 | |
| docker container rename | 重新命名容器 | |
| docker rename old_name new_name | 將容器名稱從  | |
| docker container cp | 在容器與主機之間複製檔案 | |
| docker cp container:/src/file.txt ./file.txt | 從容器複製檔案到主機當前目錄 | |
| docker cp ./config.yaml container:/app/config.yaml | 從主機複製檔案到容器 | |
| docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR" | 從容器串流日誌並過濾  | |
| docker container top | 顯示容器內正在執行的程序 | |
| docker top container | 顯示名為  | |
| docker container pause | 暫停容器中的所有程序 | |
| docker pause container | 暫停容器  | |
| docker container unpause | 恢復已暫停的容器 | |
| docker unpause container | 恢復容器  | |
| docker container update | 在不重啟的情況下更新容器設定 | |
| docker update --memory 500m container | 限制容器記憶體使用至 500 MB | 
🧱 映像檔與 Dockerfile
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker buildx build | 從 Dockerfile 建置 Docker 映像檔 | |
| docker build -t my_image . | 從當前目錄建置並標記為  | |
| docker build -t my_image:1.0 . | 建置並標記版本為  | |
| docker build --no-cache -t my_image . | 不使用快取進行乾淨建置 | |
| docker container commit | 從容器當前狀態建立映像檔 | |
| docker commit container my_img:v1 | 從容器  | |
| docker commit -m "Added config" container my_img:v2 | 建立帶提交訊息的映像檔 | |
| docker commit -a "John Doe" container my_img:latest | 建立帶作者資訊的映像檔 | |
| docker image tag | 新增或變更映像檔標籤 | |
| docker tag my_image myrepo/my_image:latest | 新增推送到  | |
| docker tag my_image:1.0 my_image:stable | 為標記為  | |
| docker tag my_image my_image:backup | 為本地映像檔新增  | |
| docker image push | 將映像檔推送到 Docker Hub 或其他登錄伺服器 | |
| docker push myrepo/my_image:latest | 將標記為  | |
| docker push myrepo/my_image:1.0 | 推送標記為  | |
| docker push myrepo/my_image | 推送預設標籤  | |
| docker login | 登入 Docker Hub 或其他登錄伺服器 | |
| docker login | 互動式輸入 Docker Hub 的使用者名稱和密碼 | |
| docker login myregistry.local:5000 | 登入私人登錄伺服器 | |
| docker login -u username -p password | 使用使用者名稱和密碼登入(不建議) | |
| docker logout | 登出 Docker Hub 或其他登錄伺服器 | |
| docker logout | 從 Docker Hub 登出 | |
| docker logout myregistry.local:5000 | 從私人登錄伺服器登出 | |
| HEALTHCHECK | Dockerfile 指令,用於自動檢查容器健康狀態 | |
| HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1 | 新增健康檢查,每 30 秒驗證服務可用性 | |
| docker inspect --format='{{json .State.Health}}' container_name | 檢查正在執行容器的健康檢查狀態 | 
🔌 網路與卷
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker network ls | 列出所有 Docker 網路 | |
| docker network ls | 顯示所有已建立的 Docker 網路 | |
| docker network ls --filter driver=bridge | 僅顯示使用  | |
| docker network ls --format '{{.Name}}' | 僅顯示網路名稱 | |
| docker network create | 建立新 Docker 網路 | |
| docker network create my_net | 建立名為  | |
| docker network create --driver bridge my_bridge_net | 建立使用  | |
| docker network create --subnet=192.168.10.0/24 my_custom_net | 建立帶指定子網的網路 | |
| docker network connect | 將容器連接到網路 | |
| docker network connect my_net container | 將名為  | |
| docker network connect --alias db_net my_net container | 以別名  | |
| docker network disconnect | 將容器從網路斷開 | |
| docker network disconnect my_net container | 將容器  | |
| docker volume ls | 列出所有 Docker 卷 | |
| docker volume ls | 顯示所有卷 | |
| docker volume ls --filter dangling=true | 顯示未使用的卷 | |
| docker volume create | 建立新 Docker 卷 | |
| docker volume create my_vol | 建立名為  | |
| docker volume create --driver local --opt type=tmpfs my_tmp_vol | 使用 tmpfs 建立臨時卷 | |
| docker volume inspect | 顯示卷的詳細資訊 | |
| docker volume inspect my_vol | 以 JSON 格式顯示  | |
| docker volume rm | 刪除一個或多個卷 | |
| docker volume rm my_vol | 刪除名為  | |
| docker volume rm $(docker volume ls -qf dangling=true) | 刪除所有未使用的卷 | 
🧩 Docker 外掛
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker plugin ls | 列出已安裝的 Docker 外掛 | |
| docker plugin ls | 顯示所有外掛及其狀態 | |
| docker plugin install | 從登錄伺服器安裝 Docker 外掛 | |
| docker plugin install vieux/sshfs | 安裝 SSHFS 卷外掛 | |
| docker plugin install store/weaveworks/net-plugin:latest_release | 安裝 Weave 網路外掛 | |
| docker plugin disable | 停用已安裝的外掛 | |
| docker plugin disable vieux/sshfs | 停用 SSHFS 外掛 | |
| docker plugin enable | 啟用先前停用的外掛 | |
| docker plugin enable vieux/sshfs | 啟用 SSHFS 外掛 | |
| docker plugin rm | 刪除 Docker 外掛 | |
| docker plugin rm vieux/sshfs | 刪除 SSHFS 外掛 | 
📋 Docker Compose
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker compose up | 啟動 docker-compose.yml中定義的容器 | |
| docker compose up | 以互動模式啟動當前目錄中的所有服務 | |
| docker compose up -d | 以背景模式啟動服務 | |
| docker compose up --build | 在啟動服務前建置映像檔 | |
| docker compose down | 停止並刪除由 up建立的容器、網路與卷 | |
| docker compose down | 停止所有服務並刪除相關資源 | |
| docker compose down --volumes | 同時刪除 Compose 建立的卷 | |
| docker compose down --rmi all | 同時刪除 Compose 建立的映像檔 | |
| docker compose logs | 查看所有或特定服務的日誌 | |
| docker compose logs | 顯示所有服務日誌 | |
| docker compose logs -f | 即時跟隨日誌 | |
| docker compose logs web | 僅顯示  | |
| docker compose exec | 在正在執行的服務容器內運行指令 | |
| docker compose exec web bash | 在  | |
| docker compose exec db ls /var/lib/postgresql | 在資料庫容器中執行  | |
| docker compose exec -d worker touch /tmp/done | 在  | |
| docker compose build | 建置或重建服務映像檔 | |
| docker compose build | 建置  | |
| docker compose build web | 僅建置  | |
| docker compose build --no-cache | 建置時不使用快取 | |
| docker compose ps | 顯示所有服務與容器的狀態 | |
| docker compose ps -a | 顯示所有容器,包括已停止的 | |
| docker compose ps --services | 僅顯示服務名稱 | |
| docker compose pull | 從登錄伺服器下載/更新服務映像檔 | |
| docker compose pull web | 僅拉取  | |
| docker compose pull --ignore-pull-failures | 即使部分映像檔失敗也繼續 | |
| docker compose restart | 重啟所有或指定的服務 | |
| docker compose restart db | 僅重啟  | |
| docker compose restart -t 10 | 以 10 秒超時重啟服務 | |
| docker compose config | 以 YAML 格式顯示最終 Compose 配置 | |
| docker compose config --services | 列出配置中的所有服務 | |
| docker compose config --volumes | 列出配置中定義的所有卷 | |
| docker compose start | 啟動已停止的服務,不重建容器 | |
| docker compose start web | 啟動  | |
| docker compose start db api | 一次啟動多個服務 | |
| docker compose stop | 停止服務但不刪除容器 | |
| docker compose stop web | 停止  | |
| docker compose stop -t 5 | 以 5 秒超時停止服務 | 
📤 匯出與匯入
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker image save | 將一個或多個 Docker 映像檔保存為 tar 壓縮檔,以便日後匯入或傳輸 | |
| docker save -o image.tar my_img:tag | 將 Docker 映像檔保存為 tar 檔案 | |
| docker save my_image > my_image.tar | 另一種方式將映像檔保存為檔案 | |
| docker save -o redis_latest.tar redis:latest | 將特定的 Redis 映像檔保存為檔案 | |
| docker image load | 從先前保存的 tar 壓縮檔匯入 Docker 映像檔 | |
| docker load < image.tar | 從 tar 檔案匯入 Docker 映像檔 | |
| docker load --input redis_latest.tar | 透過參數指定檔案匯入映像檔 | |
| docker load --quiet < my_image.tar | 匯入映像檔但不輸出進度 | |
| docker container export | 將容器的檔案系統匯出為 tar 壓縮檔,不包含映像檔歷史與中繼資料 | |
| docker export container > file.tar | 將容器檔案系統匯出為壓縮檔 | |
| docker export my_container > my_container_fs.tar | 依名稱匯出容器 | |
| docker export -o container_fs.tar container_id | 使用  | |
| docker image import | 從檔案系統的 tar 壓縮檔建立新映像檔 | |
| docker import file.tar new_img | 將壓縮檔匯入為新的 Docker 映像檔 | |
| docker import https://example.com/image.tar my_new_image | 直接從 URL 匯入映像檔 | |
| docker import - my_image < file.tar | 從標準輸入匯入 | 
🧹 清理與診斷
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker system df | 顯示 Docker 磁碟使用量:卷、映像檔、容器與建置快取 | |
| docker system df -v | 詳細輸出每個映像檔、容器與卷的資訊 | |
| docker system df --format '{{json .}}' | 以 JSON 格式輸出資訊 | |
| docker system prune | 移除所有未使用的 Docker 資料:已停止的容器、未使用的網路、懸掛映像檔與建置快取 | |
| docker system prune -a | 移除未使用的映像檔(包含中間層) | |
| docker system prune --volumes | 連同其他資源一併移除未使用的卷 | |
| docker image prune | 移除未使用的 Docker 映像檔(包含懸掛層) | |
| docker image prune -a | 移除所有未使用的映像檔(包含懸掛的) | |
| docker image prune --filter "until=24h" | 移除超過 24 小時的映像檔 | |
| docker container prune | 移除符合篩選條件的已停止容器,若無指定則移除所有已停止容器 | |
| docker container prune --filter "until=24h" | 移除超過 24 小時的已停止容器 | |
| docker container prune --force | 不經確認提示直接移除 | 
🐝 Docker Swarm
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker swarm init | 在當前節點初始化新的 Docker Swarm 叢集 | |
| docker swarm init --advertise-addr 192.168.1.100 | 指定 IP 地址初始化叢集 | |
| docker swarm init --listen-addr 0.0.0.0:2377 | 指定監聽埠初始化叢集 | |
| docker service create | 在 Swarm 叢集中建立新服務 | |
| docker service create --name nginx nginx | 在 Swarm 建立 Nginx 服務 | |
| docker service create --replicas 3 --name web webserver | 建立具有 3 個副本的服務 | |
| docker service create --name redis --publish 6379:6379 redis | 建立具有埠映射的服務 | |
| docker stack deploy | 根據 Compose 檔案將服務堆疊部署到 Swarm 叢集 | |
| docker stack deploy -c docker-compose.yml mystack | 從 Compose 檔案部署堆疊 | |
| docker stack deploy --with-registry-auth -c compose.yml mystack | 部署並轉發登錄驗證 | |
| docker stack deploy -c swarm-compose.yml mystack | 使用替代的 Compose 檔案部署堆疊 | |
| docker stack rm | 從 Swarm 叢集中移除一個或多個堆疊 | |
| docker stack rm mystack | 移除  | |
| docker stack rm | 移除所有堆疊(不建議) | |
| docker stack rm mystack && docker swarm leave --force | 移除堆疊並退出 Swarm | 
💼 進階 Docker 用法
🚀 專業 Docker 指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker buildx | 進階映像檔建置工具,取代 docker build。支援多平台、快取、平行建置與多格式輸出。適用於 CI/CD 與跨平台開發 | |
| docker buildx build --platform linux/arm64,linux/amd64 -t myimg:multi . | 建置同時支援 ARM 與 x86 的多平台映像檔 | |
| docker buildx build --load -t localimg . | 建置映像檔並載入至本地 Docker Engine 快取 | |
| docker buildx build --push --platform linux/amd64,linux/arm64 -t repo/app:latest . | 建置並推送多平台映像檔到登錄伺服器 | |
| docker context | 管理 Docker 上下文以操作遠端或多環境,可快速切換本地與遠端 Docker Engine | |
| docker context create myremote --docker "host=ssh://user@host" | 建立連接遠端 Docker 主機的上下文 | |
| docker context use myremote | 切換至遠端上下文 | |
| docker context ls | 列出可用的上下文與當前活躍的上下文 | |
| docker system events | 即時監聽 Docker 事件,可依事件類型(如容器啟動)過濾。適合監控與自動化 | |
| docker events --filter 'event=start' | 僅顯示容器啟動事件 | |
| docker events --since 1h --until 10m | 顯示從一小時前到 10 分鐘前的事件 | |
| docker events --filter 'type=network' | 僅顯示網路相關事件 | |
| docker events --filter 'image=nginx' | 顯示與  | |
| docker container update | 在不重啟的情況下變更容器的資源限制與設定 | |
| docker update --cpus 2 --memory 1g my_container | 限制為 2 顆 CPU 與 1 GB 記憶體 | |
| docker update --restart unless-stopped my_container | 設定自動重啟策略為  | |
| docker update --pids-limit 200 my_container | 限制程序數量至 200 | |
| docker container diff | 顯示容器檔案系統相對於原始映像檔的變更,適用於除錯與稽核 | |
| docker diff my_container | 顯示容器中的所有檔案系統變更 | |
| docker diff my_container | grep '^A' | 僅顯示新增的檔案 ( | |
| docker image history | 顯示映像檔層的歷史:建置指令、每層大小與建立時間。適合優化與稽核 | |
| docker history my_image | 顯示映像檔的層歷史 | |
| docker history --no-trunc my_image | 顯示未截斷的完整建置指令 | |
| docker history --format "{{.CreatedBy}}: {{.Size}}" my_image | 僅輸出建置指令與層大小 | 
🛠 實用 Docker 實踐與自動化
- 最小化映像檔大小 
 使用- alpine或- scratch等基底映像檔以減少大小。
 使用建置時的- --squash參數合併層(需啟用實驗功能)。
 在單層中刪除暫存檔案與快取:- RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
- 最小化層數 
 將多個指令組合在同一個- RUN中以減少層數與最終映像檔大小:- RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
- 最佳化 Dockerfile 建置 
 使用多階段建置,僅保留必要檔案於最終映像檔中。
 先複製並安裝依賴,再複製程式碼 — 可提升快取效率與重建速度。
- 分離機密與配置 
 切勿將- .env、API 金鑰或私有憑證存入映像檔。
 建議用於配置:- docker secret(Swarm 中)
 
- 環境變數 (-e VAR=value或.env)
 
- 外部卷存放配置 
 
- 建置時機密 (BuildKit) 
 建置過程安全傳遞機密可使用- --secret旗標:- docker buildx build --secret id=mysecret,src=./secret.txt .- 在 Dockerfile 中,機密可於 - /run/secrets/mysecret存取:- RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret- 🛡 避免機密存入映像檔層中。 
- Rootless Docker 
 以非 root 權限執行 Docker 可提升安全性並降低主機被入侵風險。
 啟用方式:- dockerd-rootless-setuptool.sh install export PATH=/usr/bin:$PATH- 檢查: - docker info | grep Rootless- ⚠ 某些功能(如小於 1024 埠的轉發)將不可用。 
- 掃描映像檔漏洞 
 使用內建工具:- docker scan my_image- 或使用新 CLI: - docker scout cves my_image- 有助於檢測基底映像檔與依賴的漏洞。 
- 監控資源使用 
 限制容器的記憶體、CPU 與程序數:- docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage- 防止資源過度消耗。 
 亦可限制 I/O:- docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage- 適用於避免容器過度佔用磁碟子系統。 
- 自動清理 
 定期移除未使用的映像檔、容器、卷與網路:- docker system prune -af --volumes- ⚠ 請注意:此指令將刪除所有未使用的資源。 - 若需選擇性清理可使用: - docker image prune --filter "until=24h"
- CI/CD 整合 
 將建置、測試與部署整合到 GitHub Actions、GitLab CI、Jenkins 等流程。
 範例 GitHub Actions 步驟:- - run: docker build -t myapp:${GITHUB_SHA} . - run: docker push myapp:${GITHUB_SHA}
- 日誌與監控 
 將日誌驅動 (- --log-driver) 連接至集中式系統:ELK、Loki、Splunk。
 使用 Prometheus + cAdvisor 收集容器指標。
- 生產部署 
 使用- docker-compose.override.yml分離開發與生產環境配置。
 高可用與擴展建議使用:- Docker Swarm
 
- Kubernetes 
 
- Docker Swarm
🐞 Docker 容器偵錯與效能分析
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker container exec | 在執行中的容器內運行指令,提供互動存取或在隔離環境中執行程序 | |
| docker exec -it my_container bash | 在執行中的容器內啟動互動式 bash 終端 | |
| docker exec -it my_container sh | 若無 bash,則啟動簡易 shell | |
| docker exec my_container ls /app | 在容器內執行非互動式指令 | |
| docker container logs | 顯示指定容器的日誌,用於診斷與監控 | |
| docker logs -f --tail 100 my_container | 即時顯示最後 100 行日誌 | |
| docker logs my_container | 顯示容器的所有可用日誌 | |
| docker logs --since 1h my_container | 顯示最近一小時的日誌 | |
| docker inspect | 輸出 Docker 物件(容器、映像檔、網路等)的詳細 JSON 資訊,包括配置與狀態 | |
| docker inspect my_container | 獲取容器的完整 JSON 資訊 | |
| docker inspect --format '{{.State.Pid}}' my_container | 獲取容器主要程序在主機上的 PID | |
| docker inspect --format '{{.NetworkSettings.IPAddress}}' my_container | 顯示容器的 IP 地址 | |
| nsenter(withstrace) | Linux 工具,用於進入另一程序(此處為容器)的命名空間。可搭配 strace在容器內追蹤系統呼叫,適用於偵錯 | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1 | 進入容器命名空間並追蹤 PID 1 的系統呼叫 | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash | 在容器命名空間中開啟 bash shell | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --net netstat -tulnp | 查看容器內開放的埠 | |
| tcpdump(inside container) | 主控台工具,用於捕獲與分析網路流量。在容器中診斷網路問題、分析封包與監控連線 | |
| docker exec -it my_container tcpdump -i any | 在容器內捕獲並分析網路流量 | |
| docker exec -it my_container tcpdump -nn port 80 | 僅捕獲埠 80 的流量 | |
| docker exec -it my_container tcpdump -w /tmp/dump.pcap | 保存流量至檔案以便後續分析 | |
| docker container stats | 即時顯示一個或多個容器的資源使用指標(CPU、記憶體、網路、磁碟) | |
| docker stats my_container | 顯示容器的 CPU、記憶體、網路與磁碟即時使用狀況 | |
| docker stats | 顯示所有容器的統計 | |
| docker stats --no-stream | 僅輸出一次統計後退出 | |
| docker container top | 顯示容器內正在執行的程序清單,類似 Linux 的 ps,用於分析容器活動 | |
| docker top my_container | 顯示容器內正在執行的程序 | |
| docker top my_container aux | 使用替代輸出格式如  | |
| docker top my_container -eo pid,cmd | 僅顯示程序 PID 與指令 | |
| docker diff | 顯示容器檔案系統相對於基底映像檔的變更,包括新增、修改或刪除的檔案 | |
| docker diff my_container | 顯示容器檔案系統的變更 | |
| docker diff my_container | grep '^A' | 僅顯示新增的檔案 ( | |
| docker diff my_container | grep '^C' | 僅顯示修改的檔案 ( | |
| docker cp | 在容器與主機之間複製檔案與目錄,用於資料交換與備份 | |
| — | — | — | 
| docker cp my_container:/path/to/file ./file | 從容器複製檔案到主機 | |
| docker cp ./config.yaml my_container:/app/config.yaml | 從主機複製檔案到容器 | |
| docker cp my_container:/var/log/app.log - | tar x -O | grep "ERROR" | 複製日誌檔並過濾錯誤行而不保存到磁碟 | 
💡 進階偵錯可使用
nsenter、strace、tcpdump、gdb等低階工具。
💼 進階 Docker Compose 用法
🚀 專業 Docker Compose 指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker compose up | 從 docker-compose.yml 啟動並管理指定服務的生命週期,可在背景模式下執行 | |
| docker compose up -d web db | 僅以背景模式執行  | |
| docker compose up --build | 啟動服務前重新建置映像檔 | |
| docker compose up --remove-orphans | 移除當前 compose 檔中未定義的容器 | |
| docker compose build | 依 compose 檔案建置服務映像檔,支援快取控制與平行建置 | |
| docker compose build --no-cache | 完全不使用快取重新建置映像檔 | |
| docker compose build --parallel | 同時建置所有服務以加快速度 | |
| docker compose build web | 僅建置  | |
| docker compose pull | 從登錄伺服器下載所有或指定服務的最新映像檔 | |
| docker compose pull | 拉取所有服務的映像檔 | |
| docker compose pull db | 僅拉取  | |
| docker compose pull --ignore-pull-failures | 忽略錯誤繼續執行 | |
| docker compose restart | 重新啟動所有或指定服務而不重建容器 | |
| docker compose restart | 重啟當前專案的所有服務 | |
| docker compose restart worker | 僅重啟  | |
| docker compose restart web db | 一次重啟多個服務 | |
| docker compose exec | 在正在執行的服務容器內執行指令,可選擇互動模式 | |
| docker compose exec db psql -U user -d database | 在  | |
| docker compose exec web sh | 在  | |
| docker compose exec api curl http://localhost:8080 | 在  | |
| docker compose config | 輸出最終 Compose 配置,包含所有檔案與環境變數 | |
| docker compose config | 以 YAML 格式顯示合併後的配置 | |
| docker compose config --services | 列出所有服務 | |
| docker compose config --environment | 顯示所有服務使用的環境變數 | |
| docker compose watch | 自動監控原始檔變更並重啟服務,適用於開發 | |
| docker compose watch | 開始監控檔案並於變更時重啟服務 | |
| docker compose events | 串流顯示 Compose 事件:服務啟動、停止、更新 | |
| docker compose events --json | 以 JSON 格式接收事件 | |
| docker compose rm | 移除已停止的服務容器 | |
| docker compose rm web db | 移除  | |
| docker compose pause | 暫停服務運行 | |
| docker compose pause api | 暫停  | |
| docker compose unpause | 恢復已暫停的服務 | |
| docker compose unpause api | 恢復  | |
| docker compose create | 建立容器但不啟動 | |
| docker compose create web db | 為  | |
| docker compose images | 顯示服務所使用的映像檔清單 | |
| docker compose images | 顯示所有服務的映像檔 | |
| docker compose top | 顯示服務容器內正在執行的程序 | |
| docker compose top web | 顯示  | 
🛠 Docker Compose 的實用技巧與自動化
- 環境分離 
 針對不同環境(開發、測試、正式)使用獨立的- docker-compose.override.yml檔案。這有助於隔離配置並避免衝突。
 你也可以用- -f參數組合多個配置檔:- docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- 使用不同的 - .env檔(如- .env.dev,- .env.prod)管理環境變數。
- 安全的機密存放 
 不要在 Compose 檔中直接放敏感資料(密碼、token)。請改用:- .env檔存放環境變數(注意:- .env檔未加密,不應提交到公開 repo)
 
- docker secret與- docker config(在 Swarm 中安全管理機密與配置)
 
- 外部卷存放包含機密的配置檔
 
- 外部秘密管理系統(如 HashiCorp Vault、AWS Secrets Manager) 
 
- 啟動順序( - depends_on與- healthcheck)
 讓服務等待依賴項準備就緒:- services: db: image: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s retries: 5 api: image: my_api depends_on: db: condition: service_healthy
- 更新時最小化停機 
 更新服務前,執行:- docker compose pull && docker compose up -d --remove-orphans- -d參數讓容器在背景執行,- --remove-orphans移除配置中未定義的容器。
 若需完全停止並刪除舊容器:- docker compose down --remove-orphans- 確保載入新映像檔並移除未使用容器而不造成停機。 
- 開發中的熱重載 (Volume) 
 使用- volumes將本機目錄掛載到容器,即時應用程式碼變更而不用重建映像檔。
 注意檔案權限與檔案系統快取特性,特別在 Windows 與 macOS 上避免效能問題。
- 無需 Volume 的熱重載 (Compose 2.22+) - develop: watch: - path: ./src action: sync target: /app
- 服務集中化日誌 
 將容器日誌導入 ELK、Loki、Prometheus、Fluentd 等系統,便於分析與告警。
 使用 Docker 日誌驅動 (- --log-driver) 啟用集中化日誌收集與處理。
 在 Compose 中為容器設定日誌驅動:- services: api: image: my_api logging: driver: "json-file" options: max-size: "10m" max-file: "3"
- 自動重啟服務 
 在- docker-compose.yml中設定重啟策略:- restart: unless-stopped- 其他策略包括: - no— 不自動重啟(預設)
 
- always— 總是重啟容器
 
- on-failure— 僅在失敗時重啟(可選擇重試次數)
 - 在生產環境中, - unless-stopped是最佳選擇,確保服務韌性。
 此策略可讓服務在故障或主機重啟後自動恢復。
- 服務配置檔 (Profiles) 
 允許僅執行特定服務組:- services: db: image: postgres profiles: ["backend"] web: image: nginx profiles: ["frontend"]- 例如只運行 frontend 配置檔: - docker compose --profile frontend up
🐞 Docker Compose 服務偵錯與效能分析
| 指令 | 範例 | 說明 | 
|---|---|---|
| docker compose exec | 在執行中的服務內執行指令,可進入容器或執行單一程序 | |
| docker compose exec web sh | 在  | |
| docker compose exec db psql -U user -d database | 在  | |
| docker compose logs | 查看服務日誌以便診斷與監控 | |
| docker compose logs -f db | 即時查看  | |
| docker compose logs --tail=50 api | 顯示  | |
| docker compose logs --since=1h web | 顯示  | |
| docker inspect | 查看服務容器的詳細資訊 | |
| docker inspect $(docker compose ps -q web) | 以 JSON 格式獲取  | |
| docker container stats | 監控服務容器的資源使用情況 | |
| docker stats $(docker compose ps -q worker) | 追蹤  | |
| docker compose run --rm | 使用服務配置運行臨時容器,適合偵錯 | |
| docker compose run --rm web sh | 以互動式 shell 啟動  | |
| docker container cp | 在主機與容器間複製檔案 | |
| docker cp $(docker compose ps -q db):/dump.sql ./dump.sql | 從  | 
💡 若需方便偵錯多服務架構,使用
docker compose run --rm啟動個別容器,保留必要的網路與卷,不影響主服務。
📚 額外資源
🚫 使用 .dockerignore 忽略檔案
在 .dockerignore 中加入不應包含進映像檔的檔案與資料夾,以減少大小並加快建置:
node_modules/
*.log
.env⚡ 用別名簡化指令
可以為常用指令建立別名以更快執行:
alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcb="docker compose build"🧠 建議:Docker 使用心得
- 不用死記所有內容 — 使用 docker --help或docker <command> --help探索指令。
 
- 定期練習並嘗試簡單專案。
 
- 注意映像檔大小,並透過 - .dockerignore移除不必要檔案。
🌐 有用連結
📘 官方 Docker 文件 — 完整指南與參考:
https://docs.docker.com/
📙 Docker 速查表 — 官方完整速查表:
https://dockerlabs.collabnix.com/docker/cheatsheet/
📗 Docker Hub — 映像檔與倉庫:
https://hub.docker.com/