🐳 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 (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 |
使用替代輸出格式如 |
|
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/