🐳 Docker

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
發佈

2025年8月31日

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

刪除 test1 倉庫中標籤為 latest 的映像檔

docker rmi 1a2b3c4d5e6f

依 ID 刪除映像檔

docker rmi $(docker images -q)

刪除所有映像檔(使用時需小心!)

🔁 容器管理

指令

範例

說明

docker container exec 在正在執行的容器內運行指令
docker exec -it container bash

在名為 container 的容器內啟動互動式 bash shell

docker exec container ls /app

在容器的 /app 目錄中執行 ls

docker exec -d container touch /tmp/testfile

在容器中以背景模式執行指令(不等待)

docker container logs 查看容器日誌
docker logs container

顯示容器 container 的所有日誌

docker logs -f container

即時跟隨容器日誌

docker logs --tail 50 container

顯示最後 50 行日誌

docker inspect 檢索容器或映像檔的詳細 JSON 資訊
docker inspect container

顯示容器 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

將容器名稱從 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

顯示名為 container 的容器程序

docker container pause 暫停容器中的所有程序
docker pause container

暫停容器 container

docker container unpause 恢復已暫停的容器
docker unpause container

恢復容器 container

docker container update 在不重啟的情況下更新容器設定
docker update --memory 500m container

限制容器記憶體使用至 500 MB

🧱 映像檔與 Dockerfile

指令

範例

說明

docker buildx build 從 Dockerfile 建置 Docker 映像檔
docker build -t my_image .

從當前目錄建置並標記為 my_image

docker build -t my_image:1.0 .

建置並標記版本為 1.0 的映像檔

docker build --no-cache -t my_image .

不使用快取進行乾淨建置

docker container commit 從容器當前狀態建立映像檔
docker commit container my_img:v1

從容器 container 建立標記為 v1my_img 映像檔

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

新增推送到 myrepo 倉庫的標籤

docker tag my_image:1.0 my_image:stable

為標記為 1.0 的映像檔建立 stable 標籤

docker tag my_image my_image:backup

為本地映像檔新增 backup 標籤

docker image push 將映像檔推送到 Docker Hub 或其他登錄伺服器
docker push myrepo/my_image:latest

將標記為 latest 的映像檔推送到 myrepo 倉庫

docker push myrepo/my_image:1.0

推送標記為 1.0 的映像檔

docker push myrepo/my_image

推送預設標籤 latest 的映像檔

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

僅顯示使用 bridge 驅動的網路

docker network ls --format '{{.Name}}'

僅顯示網路名稱

docker network create 建立新 Docker 網路
docker network create my_net

建立名為 my_net 的網路(預設設定)

docker network create --driver bridge my_bridge_net

建立使用 bridge 驅動的網路

docker network create --subnet=192.168.10.0/24 my_custom_net

建立帶指定子網的網路

docker network connect 將容器連接到網路
docker network connect my_net container

將名為 container 的容器連接到 my_net 網路

docker network connect --alias db_net my_net container

以別名 db_net 連接

docker network disconnect 將容器從網路斷開
docker network disconnect my_net container

將容器 containermy_net 網路斷開

docker volume ls 列出所有 Docker 卷
docker volume ls

顯示所有卷

docker volume ls --filter dangling=true

顯示未使用的卷

docker volume create 建立新 Docker 卷
docker volume create my_vol

建立名為 my_vol 的卷

docker volume create --driver local --opt type=tmpfs my_tmp_vol

使用 tmpfs 建立臨時卷

docker volume inspect 顯示卷的詳細資訊
docker volume inspect my_vol

以 JSON 格式顯示 my_vol 卷的詳細資訊

docker volume rm 刪除一個或多個卷
docker volume rm my_vol

刪除名為 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

僅顯示 web 服務的日誌

docker compose exec 在正在執行的服務容器內運行指令
docker compose exec web bash

web 服務容器內進入互動式 bash shell

docker compose exec db ls /var/lib/postgresql

在資料庫容器中執行 ls

docker compose exec -d worker touch /tmp/done

worker 容器內以背景模式執行指令

docker compose build 建置或重建服務映像檔
docker compose build

建置 docker-compose.yml 中定義的所有映像檔

docker compose build web

僅建置 web 服務映像檔

docker compose build --no-cache

建置時不使用快取

docker compose ps 顯示所有服務與容器的狀態
docker compose ps -a

顯示所有容器,包括已停止的

docker compose ps --services

僅顯示服務名稱

docker compose pull 從登錄伺服器下載/更新服務映像檔
docker compose pull web

僅拉取 web 服務的映像檔

docker compose pull --ignore-pull-failures

即使部分映像檔失敗也繼續

docker compose restart 重啟所有或指定的服務
docker compose restart db

僅重啟 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

啟動 web 服務

docker compose start db api

一次啟動多個服務

docker compose stop 停止服務但不刪除容器
docker compose stop web

停止 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

使用 -o 旗標依容器 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

移除 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'

顯示與 nginx 映像檔相關的事件

docker container update 在不重啟的情況下變更容器的資源限制與設定
docker update --cpus 2 --memory 1g my_container

限制為 2 顆 CPU 與 1 GB 記憶體

docker update --restart unless-stopped my_container

設定自動重啟策略為 unless-stopped

docker update --pids-limit 200 my_container

限制程序數量至 200

docker container diff 顯示容器檔案系統相對於原始映像檔的變更,適用於除錯與稽核
docker diff my_container

顯示容器中的所有檔案系統變更

docker diff my_container | grep '^A'

僅顯示新增的檔案 (A — Added)

docker image history 顯示映像檔層的歷史:建置指令、每層大小與建立時間。適合優化與稽核
docker history my_image

顯示映像檔的層歷史

docker history --no-trunc my_image

顯示未截斷的完整建置指令

docker history --format "{{.CreatedBy}}: {{.Size}}" my_image

僅輸出建置指令與層大小

🛠 實用 Docker 實踐與自動化

  • 最小化映像檔大小
    使用 alpinescratch 等基底映像檔以減少大小。
    使用建置時的 --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 容器偵錯與效能分析

指令

範例

說明

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 (with strace) 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

使用替代輸出格式如 ps aux

docker top my_container -eo pid,cmd

僅顯示程序 PID 與指令

docker diff 顯示容器檔案系統相對於基底映像檔的變更,包括新增、修改或刪除的檔案
docker diff my_container

顯示容器檔案系統的變更

docker diff my_container | grep '^A'

僅顯示新增的檔案 (A — Added)

docker diff my_container | grep '^C'

僅顯示修改的檔案 (C — Changed)

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"

複製日誌檔並過濾錯誤行而不保存到磁碟

💡 進階偵錯可使用 nsenterstracetcpdumpgdb 等低階工具。

💼 進階 Docker Compose 用法

🚀 專業 Docker Compose 指令

指令

範例

說明

docker compose up 從 docker-compose.yml 啟動並管理指定服務的生命週期,可在背景模式下執行
docker compose up -d web db

僅以背景模式執行 webdb 服務

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

僅建置 web 服務的映像檔

docker compose pull 從登錄伺服器下載所有或指定服務的最新映像檔
docker compose pull

拉取所有服務的映像檔

docker compose pull db

僅拉取 db 服務的映像檔

docker compose pull --ignore-pull-failures

忽略錯誤繼續執行

docker compose restart 重新啟動所有或指定服務而不重建容器
docker compose restart

重啟當前專案的所有服務

docker compose restart worker

僅重啟 worker 服務

docker compose restart web db

一次重啟多個服務

docker compose exec 在正在執行的服務容器內執行指令,可選擇互動模式
docker compose exec db psql -U user -d database

db 服務容器中執行 psql

docker compose exec web sh

web 容器中開啟 shell

docker compose exec api curl http://localhost:8080

api 服務容器中執行 curl 請求

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

移除 webdb 服務的容器

docker compose pause 暫停服務運行
docker compose pause api

暫停 api 服務

docker compose unpause 恢復已暫停的服務
docker compose unpause api

恢復 api 服務

docker compose create 建立容器但不啟動
docker compose create web db

webdb 建立容器但不啟動

docker compose images 顯示服務所使用的映像檔清單
docker compose images

顯示所有服務的映像檔

docker compose top 顯示服務容器內正在執行的程序
docker compose top web

顯示 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 secretdocker config(在 Swarm 中安全管理機密與配置)
    • 外部卷存放包含機密的配置檔
    • 外部秘密管理系統(如 HashiCorp Vault、AWS Secrets Manager)

  • 啟動順序(depends_onhealthcheck
    讓服務等待依賴項準備就緒:

    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

web 服務容器中開啟 shell

docker compose exec db psql -U user -d database

db 服務容器中執行 psql

docker compose logs 查看服務日誌以便診斷與監控
docker compose logs -f db

即時查看 db 服務日誌

docker compose logs --tail=50 api

顯示 api 服務的最後 50 行日誌

docker compose logs --since=1h web

顯示 web 服務最近一小時的日誌

docker inspect 查看服務容器的詳細資訊
docker inspect $(docker compose ps -q web)

以 JSON 格式獲取 web 服務容器的詳細資料

docker container stats 監控服務容器的資源使用情況
docker stats $(docker compose ps -q worker)

追蹤 worker 服務容器的 CPU、記憶體與其他資源使用

docker compose run --rm 使用服務配置運行臨時容器,適合偵錯
docker compose run --rm web sh

以互動式 shell 啟動 web 服務的一次性容器

docker container cp 在主機與容器間複製檔案
docker cp $(docker compose ps -q db):/dump.sql ./dump.sql

db 服務容器複製檔案到主機

💡 若需方便偵錯多服務架構,使用 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 --helpdocker <command> --help 探索指令。
  • 定期練習並嘗試簡單專案。
  • 注意映像檔大小,並透過 .dockerignore 移除不必要檔案。

🌐 有用連結

📘 官方 Docker 文件 — 完整指南與參考:
https://docs.docker.com/

📙 Docker 速查表 — 官方完整速查表:
https://dockerlabs.collabnix.com/docker/cheatsheet/

📗 Docker Hub — 映像檔與倉庫:
https://hub.docker.com/