🐳 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 建立標記為 v1 的映像檔 my_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

將容器 container 從網路 my_net 斷開

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

顯示所有 Docker 卷

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

    🛡 這可避免密鑰被儲存在映像檔層中。

  • 無 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 容器除錯與分析

指令

範例

說明

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

使用替代輸出格式,如 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 的實用技巧與自動化

  • 環境分離
    為不同環境(developmentstagingproduction)使用不同的 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 secretdocker config 用於 Docker 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

    這可確保載入新映像檔並移除未使用容器而不造成停機。

  • 開發中的熱重載 (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

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)

取得 web 服務容器的詳細 JSON 資訊

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

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

docker compose run --rm 以服務設定執行暫時性容器,適合除錯
docker compose run --rm web sh

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/