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