🐳 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" | 從容器串流日誌檔並過濾含有 “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 卷 | |
| 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- 🛡 這可避免密鑰被儲存在映像檔層中。 
- 無 root 權限的 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 pipeline。
 範例 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 | 在容器中啟動最小化 shell(若無 bash) | |
| 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 | 進入容器命名空間並追蹤程序 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 的實用技巧與自動化
- 環境分離 
 為不同環境(- development、- staging、- production)使用不同的- docker-compose.override.yml,可避免設定衝突並隔離配置。
 你也可以使用- -f旗標組合多個配置檔:- docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- 使用不同的 - .env檔(如- .env.dev、- .env.prod)來管理環境變數。
- 安全儲存密鑰 
 不要將敏感資料(密碼、token)直接放入 Compose 檔,而是使用:- .env檔存放環境變數(注意- .env檔未加密,且不應提交到公開版本庫)
 
- docker secret與- docker config用於 Docker 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- 這可確保載入新映像檔並移除未使用容器而不造成停機。 
- 開發中的熱重載 (Hot Reload) 
 使用- volumes將本機目錄掛載到容器中,這能讓程式碼變更立即生效而不必重建映像檔。
 注意檔案權限與檔案系統快取問題,特別是在 Windows 與 macOS 上,避免效能問題。
- 無需 Volume 的熱重載(Compose 2.22+) - develop: watch: - path: ./src action: sync target: /app
- 服務的集中式日誌 
 將容器日誌導向 ELK Stack、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) | 取得  | |
| docker container stats | 監控執行服務的容器資源使用情況 | |
| docker stats $(docker compose ps -q worker) | 追蹤  | |
| docker compose run --rm | 以服務設定執行暫時性容器,適合除錯 | |
| docker compose run --rm web sh | 為  | |
| 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/