Docker 完整指南(二):指令大全與實務操作

🎯 前言

在上一篇文章中,我們了解了 Docker 的基礎概念與架構。本文將深入探討 Docker 指令的實務應用,從基礎操作到進階技巧,幫助你全面掌握 Docker CLI 的使用。

本文重點:

  • Docker 指令體系與結構
  • 容器生命週期管理
  • 映像操作與管理
  • 網路與儲存配置
  • 實用技巧與最佳實踐

📋 Docker 指令體系

Docker CLI 結構

graph TB
    CLI[Docker CLI] --> MGMT[管理指令<br/>Management Commands]
    CLI --> LEGACY[傳統指令<br/>Legacy Commands]

    MGMT --> CONTAINER[docker container]
    MGMT --> IMAGE[docker image]
    MGMT --> NETWORK[docker network]
    MGMT --> VOLUME[docker volume]
    MGMT --> SYSTEM[docker system]

    LEGACY --> RUN[docker run]
    LEGACY --> PS[docker ps]
    LEGACY --> BUILD[docker build]
    LEGACY --> PULL[docker pull]

    style MGMT fill:#4ecdc4
    style LEGACY fill:#feca57

指令格式對照

傳統指令新版管理指令說明
docker psdocker container ls列出容器
docker imagesdocker image ls列出映像
docker rmdocker container rm刪除容器
docker rmidocker image rm刪除映像
docker inspectdocker container inspect查看容器詳情

建議: 新專案使用管理指令格式,更清晰且易於理解。

🔧 容器管理指令

容器生命週期操作

stateDiagram-v2
    [*] --> Created: docker create
    Created --> Running: docker start
    Running --> Paused: docker pause
    Paused --> Running: docker unpause
    Running --> Stopped: docker stop
    Stopped --> Running: docker start
    Running --> Removed: docker rm -f
    Stopped --> Removed: docker rm
    Removed --> [*]

1. docker run - 創建並運行容器

基本語法:

1docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用選項對照表:

選項簡寫說明範例
--detach-d背景運行docker run -d nginx
--interactive-i保持 STDIN 開啟docker run -i ubuntu
--tty-t分配終端機docker run -it ubuntu bash
--name指定容器名稱docker run --name web nginx
--publish-p埠映射docker run -p 8080:80 nginx
--volume-v掛載資料卷docker run -v /data:/app/data nginx
--env-e設定環境變數docker run -e ENV=prod nginx
--rm停止後自動刪除docker run --rm nginx
--restart重啟策略docker run --restart=always nginx
--memory-m記憶體限制docker run -m 512m nginx
--cpusCPU 限制docker run --cpus="1.5" nginx
--network指定網路docker run --network=my-net nginx

實用範例:

 1# 1. 運行簡單的 web 伺服器
 2docker run -d -p 80:80 --name my-nginx nginx:latest
 3
 4# 2. 運行互動式容器
 5docker run -it --rm ubuntu:20.04 bash
 6
 7# 3. 運行帶環境變數的容器
 8docker run -d \
 9  --name my-app \
10  -e DATABASE_URL=postgres://db:5432 \
11  -e DEBUG=true \
12  -p 3000:3000 \
13  my-app:latest
14
15# 4. 掛載資料卷運行容器
16docker run -d \
17  --name mysql-db \
18  -e MYSQL_ROOT_PASSWORD=secret \
19  -v mysql-data:/var/lib/mysql \
20  -p 3306:3306 \
21  mysql:8.0
22
23# 5. 設定資源限制
24docker run -d \
25  --name resource-limited \
26  --memory="512m" \
27  --cpus="1.0" \
28  --restart=unless-stopped \
29  nginx:alpine
30
31# 6. 運行臨時測試容器
32docker run --rm -it \
33  -v $(pwd):/workspace \
34  -w /workspace \
35  node:18 \
36  npm test

2. docker ps - 列出容器

 1# 列出運行中的容器
 2docker ps
 3
 4# 列出所有容器(包含已停止)
 5docker ps -a
 6
 7# 只顯示容器 ID
 8docker ps -q
 9
10# 自訂輸出格式
11docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
12
13# 過濾特定狀態的容器
14docker ps --filter "status=running"
15docker ps --filter "status=exited"
16
17# 顯示最近創建的 N 個容器
18docker ps -n 5
19
20# 顯示容器大小
21docker ps -s

輸出欄位說明:

欄位說明
CONTAINER ID容器唯一識別碼(短格式)
IMAGE使用的映像
COMMAND容器啟動時執行的指令
CREATED創建時間
STATUS當前狀態(Up, Exited, Paused 等)
PORTS埠映射資訊
NAMES容器名稱

3. docker start/stop/restart - 容器狀態控制

 1# 啟動容器
 2docker start container-name
 3
 4# 停止容器(優雅停止,預設等待 10 秒)
 5docker stop container-name
 6
 7# 立即停止容器
 8docker kill container-name
 9
10# 重啟容器
11docker restart container-name
12
13# 批次操作多個容器
14docker start container1 container2 container3
15docker stop $(docker ps -q)  # 停止所有運行中的容器
16
17# 停止所有容器
18docker stop $(docker ps -aq)
19
20# 設定停止等待時間
21docker stop -t 30 container-name  # 等待 30 秒後強制停止

停止策略對照:

指令信號等待時間使用時機
docker stopSIGTERM → SIGKILL10 秒(可調整)正常停止容器
docker killSIGKILL立即強制終止容器
docker pause暫停N/A臨時暫停容器

4. docker exec - 在運行中的容器執行指令

 1# 在容器中執行指令
 2docker exec container-name command
 3
 4# 進入容器的互動式 shell
 5docker exec -it container-name bash
 6docker exec -it container-name sh  # Alpine 容器使用 sh
 7
 8# 以特定使用者執行
 9docker exec -u root container-name whoami
10
11# 設定工作目錄
12docker exec -w /app container-name ls -la
13
14# 執行多個指令
15docker exec container-name sh -c "cd /app && npm install"
16
17# 實用範例
18docker exec my-nginx nginx -t  # 測試 Nginx 配置
19docker exec my-mysql mysqldump -u root -p database > backup.sql
20docker exec my-redis redis-cli INFO

exec vs attach 差異:

特性docker execdocker attach
用途執行新進程連接到主進程
退出影響不影響容器可能停止容器
互動性可設定繼承原進程
使用場景調試、維護查看輸出

5. docker logs - 查看容器日誌

 1# 查看容器日誌
 2docker logs container-name
 3
 4# 實時跟蹤日誌(類似 tail -f)
 5docker logs -f container-name
 6
 7# 顯示最後 N 行日誌
 8docker logs --tail 100 container-name
 9
10# 顯示時間戳
11docker logs -t container-name
12
13# 查看指定時間範圍的日誌
14docker logs --since 2023-01-01 container-name
15docker logs --since 30m container-name  # 最近 30 分鐘
16docker logs --until 2023-12-31 container-name
17
18# 組合使用
19docker logs -f --tail 50 --since 10m container-name

日誌驅動類型:

驅動說明適用場景
json-file預設,JSON 格式開發、小規模部署
syslog系統日誌集中式日誌管理
journaldsystemd journalsystemd 環境
gelfGraylog Extended Log FormatGraylog、Logstash
fluentdFluentd 日誌收集大規模日誌聚合
awslogsAWS CloudWatchAWS 環境

6. docker inspect - 查看詳細資訊

 1# 查看容器完整資訊
 2docker inspect container-name
 3
 4# 使用 Go 模板格式化輸出
 5docker inspect --format='{{.State.Status}}' container-name
 6docker inspect --format='{{.NetworkSettings.IPAddress}}' container-name
 7docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container-name
 8
 9# 查看特定欄位
10docker inspect --format='{{json .Config.Env}}' container-name | jq
11docker inspect --format='{{.Mounts}}' container-name
12docker inspect --format='{{.HostConfig.RestartPolicy}}' container-name
13
14# 實用查詢範例
15# 獲取容器 IP 位址
16docker inspect -f '{{.NetworkSettings.IPAddress}}' container-name
17
18# 獲取掛載點
19docker inspect -f '{{json .Mounts}}' container-name | jq
20
21# 獲取環境變數
22docker inspect -f '{{json .Config.Env}}' container-name | jq
23
24# 獲取埠映射
25docker inspect -f '{{json .NetworkSettings.Ports}}' container-name | jq

7. docker rm - 刪除容器

 1# 刪除已停止的容器
 2docker rm container-name
 3
 4# 強制刪除運行中的容器
 5docker rm -f container-name
 6
 7# 刪除多個容器
 8docker rm container1 container2 container3
 9
10# 刪除所有已停止的容器
11docker rm $(docker ps -aq -f status=exited)
12
13# 使用 container prune 清理(推薦)
14docker container prune
15
16# 刪除所有容器(危險操作!)
17docker rm -f $(docker ps -aq)
18
19# 刪除容器並移除關聯的資料卷
20docker rm -v container-name

容器管理實用指令組合

 1# 查看容器資源使用情況
 2docker stats
 3
 4# 查看特定容器的統計資訊
 5docker stats container-name
 6
 7# 不持續更新,只顯示一次
 8docker stats --no-stream
 9
10# 查看容器內運行的進程
11docker top container-name
12
13# 複製檔案(容器 ↔ 主機)
14docker cp container-name:/path/to/file ./local/path
15docker cp ./local/file container-name:/path/to/destination
16
17# 查看容器變更的檔案
18docker diff container-name
19
20# 將容器提交為新映像
21docker commit container-name new-image-name:tag
22
23# 匯出容器為 tar 檔案
24docker export container-name > container.tar
25
26# 從 tar 檔案匯入為映像
27cat container.tar | docker import - imported-image:tag

🖼️ 映像管理指令

映像操作流程

graph LR
    A[docker search] -->|搜尋| B[docker pull]
    B -->|下載| C[docker images]
    C -->|檢視| D[docker run]
    D -->|使用| E[docker commit]
    E -->|保存| F[docker push]
    F -->|上傳| G[Registry]

    H[Dockerfile] -->|docker build| C

    style B fill:#4ecdc4
    style H fill:#feca57
    style F fill:#ff6b6b

1. docker images - 列出映像

 1# 列出所有映像
 2docker images
 3
 4# 列出特定倉庫的映像
 5docker images nginx
 6
 7# 只顯示映像 ID
 8docker images -q
 9
10# 顯示懸掛映像(dangling images)
11docker images -f "dangling=true"
12
13# 格式化輸出
14docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
15
16# 顯示映像摘要(digest)
17docker images --digests
18
19# 顯示所有映像(包含中間層)
20docker images -a

輸出欄位說明:

欄位說明
REPOSITORY映像倉庫名稱
TAG映像標籤(版本)
IMAGE ID映像唯一識別碼
CREATED創建時間
SIZE映像大小

2. docker pull - 下載映像

 1# 下載最新版本映像
 2docker pull nginx
 3
 4# 下載特定版本
 5docker pull nginx:1.21.0
 6
 7# 下載特定平台的映像
 8docker pull --platform linux/amd64 nginx
 9docker pull --platform linux/arm64 nginx
10
11# 從私有 Registry 下載
12docker pull myregistry.com:5000/myimage:tag
13
14# 下載所有標籤
15docker pull -a nginx  # 小心!可能很大
16
17# 使用摘要下載(確保完整性)
18docker pull nginx@sha256:abc123...

映像命名規範:

[registry-host[:port]/][namespace/]repository[:tag][@digest]

範例:
- nginx                           # Docker Hub 官方映像
- nginx:latest                    # 指定標籤
- ubuntu:20.04                    # Ubuntu 20.04 版本
- mycompany/myapp:v1.0           # 私有倉庫
- gcr.io/google-samples/hello-app:1.0  # Google Container Registry
- nginx@sha256:abc123...         # 使用摘要

3. docker build - 建立映像

 1# 從 Dockerfile 建立映像
 2docker build -t myimage:tag .
 3
 4# 指定 Dockerfile 位置
 5docker build -t myimage:tag -f Dockerfile.prod .
 6
 7# 不使用快取
 8docker build --no-cache -t myimage:tag .
 9
10# 設定建立參數
11docker build --build-arg VERSION=1.0 -t myimage:tag .
12
13# 多平台建立
14docker buildx build --platform linux/amd64,linux/arm64 -t myimage:tag .
15
16# 設定目標階段(多階段建立)
17docker build --target production -t myimage:tag .
18
19# 標記多個標籤
20docker build -t myimage:latest -t myimage:v1.0 -t myimage:stable .
21
22# 實用範例
23# 建立並添加多個標籤
24docker build \
25  -t myapp:latest \
26  -t myapp:v1.0.0 \
27  -t myregistry.com/myapp:latest \
28  --build-arg NODE_ENV=production \
29  --label "version=1.0.0" \
30  --label "description=My Application" \
31  .

常用建立選項:

選項說明範例
-t, --tag指定映像名稱和標籤-t app:v1
-f, --file指定 Dockerfile-f Dockerfile.prod
--build-arg設定建立時變數--build-arg VERSION=1.0
--no-cache不使用快取--no-cache
--target多階段建立目標--target production
--platform目標平台--platform linux/amd64
--label添加元資料標籤--label version=1.0

4. docker tag - 標記映像

 1# 為映像添加新標籤
 2docker tag source-image:tag target-image:tag
 3
 4# 標記為 latest
 5docker tag myapp:v1.0 myapp:latest
 6
 7# 標記到私有 Registry
 8docker tag myapp:v1.0 myregistry.com:5000/myapp:v1.0
 9
10# 多個標籤範例
11docker tag nginx:latest nginx:stable
12docker tag nginx:latest nginx:production
13docker tag nginx:latest myregistry.com/nginx:latest

5. docker push - 上傳映像

 1# 推送映像到 Docker Hub
 2docker push username/myimage:tag
 3
 4# 推送到私有 Registry
 5docker push myregistry.com:5000/myimage:tag
 6
 7# 推送所有標籤
 8docker push -a username/myimage
 9
10# 完整工作流程範例
11# 1. 登入 Registry
12docker login
13# 或登入私有 Registry
14docker login myregistry.com:5000
15
16# 2. 標記映像
17docker tag myapp:latest username/myapp:latest
18docker tag myapp:latest username/myapp:v1.0.0
19
20# 3. 推送映像
21docker push username/myapp:latest
22docker push username/myapp:v1.0.0
23
24# 4. 登出
25docker logout

6. docker rmi - 刪除映像

 1# 刪除映像
 2docker rmi image-name:tag
 3
 4# 強制刪除(即使有容器使用)
 5docker rmi -f image-name:tag
 6
 7# 刪除多個映像
 8docker rmi image1 image2 image3
 9
10# 刪除所有懸掛映像
11docker rmi $(docker images -f "dangling=true" -q)
12
13# 使用 image prune 清理(推薦)
14docker image prune
15
16# 刪除所有未使用的映像
17docker image prune -a
18
19# 刪除所有映像(危險!)
20docker rmi $(docker images -q)

7. docker history - 查看映像歷史

 1# 查看映像層歷史
 2docker history image-name:tag
 3
 4# 不截斷輸出
 5docker history --no-trunc image-name:tag
 6
 7# 以人類可讀格式顯示大小
 8docker history --human image-name:tag
 9
10# 輸出範例分析
11# IMAGE          CREATED        CREATED BY                                      SIZE
12# abc123         2 days ago     /bin/sh -c apt-get update && apt-get install   150MB
13# def456         2 days ago     /bin/sh -c #(nop) COPY file:xyz /app           50MB
14# ghi789         3 days ago     /bin/sh -c #(nop) FROM ubuntu:20.04            80MB

映像管理實用技巧

 1# 映像大小優化檢查
 2docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k3 -h
 3
 4# 查找並刪除大於 1GB 的映像
 5docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | \
 6  awk '$2 ~ /GB/ {print $1}' | \
 7  xargs docker rmi
 8
 9# 保存映像為 tar 檔案
10docker save -o myimage.tar myimage:tag
11docker save myimage:tag | gzip > myimage.tar.gz
12
13# 從 tar 檔案載入映像
14docker load -i myimage.tar
15docker load < myimage.tar.gz
16
17# 映像內容檢查
18docker run --rm -it myimage:tag sh
19docker run --rm -it --entrypoint sh myimage:tag
20
21# 掃描映像漏洞
22docker scan myimage:tag
23
24# 查看映像詳細資訊
25docker inspect myimage:tag
26
27# 獲取映像配置
28docker inspect --format='{{json .Config}}' myimage:tag | jq

🌐 網路管理指令

Docker 網路模式

graph TB
    A[Docker 網路模式] --> B[bridge<br/>橋接網路]
    A --> C[host<br/>主機網路]
    A --> D[none<br/>無網路]
    A --> E[container<br/>容器網路]
    A --> F[custom<br/>自訂網路]

    B --> B1[預設模式<br/>NAT 轉發<br/>容器互聯]
    C --> C1[共享主機網路<br/>效能最佳<br/>埠衝突風險]
    D --> D1[完全隔離<br/>無網路存取]
    E --> E1[共享其他容器網路<br/>Kubernetes Pod 模式]
    F --> F1[自訂 IP 範圍<br/>DNS 解析<br/>網路隔離]

    style B fill:#4ecdc4
    style F fill:#feca57

網路模式對照表

模式說明使用場景命令
bridge預設網路,NAT 模式一般應用--network bridge
host共享主機網路棧高效能需求--network host
none無網路安全隔離--network none
container共享其他容器網路微服務--network container:name
自訂使用者定義網路生產環境--network my-network

1. docker network ls - 列出網路

1# 列出所有網路
2docker network ls
3
4# 過濾特定驅動的網路
5docker network ls --filter driver=bridge
6
7# 格式化輸出
8docker network ls --format "table {{.Name}}\t{{.Driver}}\t{{.Scope}}"

2. docker network create - 創建網路

 1# 創建預設 bridge 網路
 2docker network create my-network
 3
 4# 指定子網路和閘道
 5docker network create \
 6  --driver bridge \
 7  --subnet 172.18.0.0/16 \
 8  --gateway 172.18.0.1 \
 9  my-network
10
11# 創建 overlay 網路(Swarm 模式)
12docker network create \
13  --driver overlay \
14  --attachable \
15  my-overlay-network
16
17# 指定 IP 範圍
18docker network create \
19  --subnet 192.168.0.0/24 \
20  --ip-range 192.168.0.128/25 \
21  --gateway 192.168.0.1 \
22  my-custom-network
23
24# 實用範例:完整配置
25docker network create \
26  --driver bridge \
27  --subnet 172.20.0.0/16 \
28  --ip-range 172.20.240.0/20 \
29  --gateway 172.20.0.1 \
30  --label project=myapp \
31  --label environment=production \
32  app-network

3. docker network connect/disconnect - 連接網路

 1# 將容器連接到網路
 2docker network connect my-network container-name
 3
 4# 指定容器在網路中的 IP
 5docker network connect --ip 172.18.0.10 my-network container-name
 6
 7# 設定別名(DNS)
 8docker network connect --alias db my-network mysql-container
 9
10# 從網路斷開容器
11docker network disconnect my-network container-name
12
13# 強制斷開
14docker network disconnect -f my-network container-name

4. docker network inspect - 檢查網路

1# 查看網路詳細資訊
2docker network inspect my-network
3
4# 查看連接到網路的容器
5docker network inspect --format='{{range .Containers}}{{.Name}} {{end}}' my-network
6
7# 查看網路配置
8docker network inspect --format='{{json .IPAM.Config}}' my-network | jq

5. docker network rm - 刪除網路

1# 刪除網路
2docker network rm my-network
3
4# 刪除所有未使用的網路
5docker network prune
6
7# 強制刪除(斷開所有連接的容器)
8docker network rm -f my-network

網路實用範例

 1# 微服務網路配置範例
 2# 1. 創建專用網路
 3docker network create \
 4  --driver bridge \
 5  --subnet 172.25.0.0/16 \
 6  microservices-network
 7
 8# 2. 啟動服務並連接網路
 9docker run -d \
10  --name api-service \
11  --network microservices-network \
12  --network-alias api \
13  my-api:latest
14
15docker run -d \
16  --name database \
17  --network microservices-network \
18  --network-alias db \
19  postgres:13
20
21docker run -d \
22  --name cache \
23  --network microservices-network \
24  --network-alias redis \
25  redis:alpine
26
27# 3. 容器間可以通過別名互相訪問
28# api-service 可以使用 db 和 redis 作為主機名
29
30# 多網路配置範例
31# 前端網路(公開)
32docker network create frontend-network
33
34# 後端網路(私有)
35docker network create backend-network
36
37# Web 服務器(連接到前端網路)
38docker run -d \
39  --name nginx \
40  --network frontend-network \
41  -p 80:80 \
42  nginx:alpine
43
44# 應用服務器(連接到兩個網路)
45docker run -d \
46  --name app \
47  --network frontend-network \
48  my-app:latest
49
50docker network connect backend-network app
51
52# 資料庫(只連接到後端網路)
53docker run -d \
54  --name postgres \
55  --network backend-network \
56  postgres:13

💾 資料卷管理指令

資料持久化方案

graph TB
    A[Docker 資料管理] --> B[Volume<br/>Docker 管理]
    A --> C[Bind Mount<br/>主機路徑]
    A --> D[tmpfs<br/>記憶體儲存]

    B --> B1[最佳實踐<br/>易於備份<br/>跨平台]
    C --> C1[開發環境<br/>直接存取<br/>路徑依賴]
    D --> D1[臨時資料<br/>高效能<br/>不持久化]

    style B fill:#4ecdc4
    style C fill:#feca57
    style D fill:#ff6b6b

1. docker volume ls - 列出資料卷

1# 列出所有資料卷
2docker volume ls
3
4# 過濾孤立的資料卷
5docker volume ls --filter dangling=true
6
7# 格式化輸出
8docker volume ls --format "table {{.Name}}\t{{.Driver}}\t{{.Mountpoint}}"

2. docker volume create - 創建資料卷

 1# 創建預設資料卷
 2docker volume create my-volume
 3
 4# 指定驅動
 5docker volume create --driver local my-volume
 6
 7# 使用標籤
 8docker volume create \
 9  --label project=myapp \
10  --label environment=prod \
11  my-volume
12
13# 創建 NFS 資料卷
14docker volume create \
15  --driver local \
16  --opt type=nfs \
17  --opt o=addr=192.168.1.100,rw \
18  --opt device=:/path/to/dir \
19  nfs-volume

3. docker volume inspect - 檢查資料卷

1# 查看資料卷詳細資訊
2docker volume inspect my-volume
3
4# 獲取掛載點
5docker volume inspect --format='{{.Mountpoint}}' my-volume
6
7# 查看資料卷選項
8docker volume inspect --format='{{json .Options}}' my-volume | jq

4. docker volume rm - 刪除資料卷

 1# 刪除資料卷
 2docker volume rm my-volume
 3
 4# 刪除多個資料卷
 5docker volume rm volume1 volume2 volume3
 6
 7# 刪除所有未使用的資料卷
 8docker volume prune
 9
10# 強制刪除(不提示確認)
11docker volume prune -f

資料卷使用範例

 1# 1. 資料庫資料持久化
 2docker run -d \
 3  --name postgres \
 4  -e POSTGRES_PASSWORD=secret \
 5  -v postgres-data:/var/lib/postgresql/data \
 6  postgres:13
 7
 8# 2. Bind Mount 開發環境
 9docker run -d \
10  --name dev-app \
11  -v $(pwd)/src:/app/src \
12  -v $(pwd)/config:/app/config:ro \
13  -p 3000:3000 \
14  node:18
15
16# 3. 多個資料卷
17docker run -d \
18  --name web-app \
19  -v app-data:/app/data \
20  -v app-logs:/app/logs \
21  -v app-config:/app/config:ro \
22  my-app:latest
23
24# 4. 資料卷備份
25docker run --rm \
26  -v my-volume:/source:ro \
27  -v $(pwd):/backup \
28  ubuntu \
29  tar czf /backup/backup-$(date +%Y%m%d).tar.gz -C /source .
30
31# 5. 資料卷還原
32docker run --rm \
33  -v my-volume:/target \
34  -v $(pwd):/backup:ro \
35  ubuntu \
36  tar xzf /backup/backup-20231201.tar.gz -C /target
37
38# 6. 資料卷複製
39docker run --rm \
40  -v source-volume:/source:ro \
41  -v target-volume:/target \
42  ubuntu \
43  cp -av /source/. /target/

🔄 系統管理指令

1. docker info - 系統資訊

1# 顯示 Docker 系統資訊
2docker info
3
4# 格式化輸出特定資訊
5docker info --format '{{.ServerVersion}}'
6docker info --format '{{json .}}' | jq

2. docker system df - 磁碟使用情況

 1# 顯示磁碟使用情況
 2docker system df
 3
 4# 詳細資訊
 5docker system df -v
 6
 7# 輸出範例:
 8# TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
 9# Images          10        5         2.5GB     1.2GB (48%)
10# Containers      20        3         500MB     400MB (80%)
11# Local Volumes   15        10        5GB       2GB (40%)
12# Build Cache     50        0         3GB       3GB (100%)

3. docker system prune - 清理系統

 1# 清理所有未使用的資源
 2docker system prune
 3
 4# 包含停止的容器
 5docker system prune -a
 6
 7# 同時清理資料卷
 8docker system prune --volumes
 9
10# 不提示確認
11docker system prune -af
12
13# 清理特定時間前的資源
14docker system prune --filter "until=24h"
15docker system prune --filter "until=2023-01-01"
16
17# 分別清理各類資源
18docker container prune  # 清理容器
19docker image prune      # 清理映像
20docker network prune    # 清理網路
21docker volume prune     # 清理資料卷

清理策略對照表:

指令清理內容安全性
docker container prune已停止的容器安全
docker image prune懸掛映像安全
docker image prune -a未使用的映像需謹慎
docker network prune未使用的網路安全
docker volume prune未使用的資料卷危險
docker system prune所有未使用資源(不含 volume)需謹慎
docker system prune -a --volumes所有未使用資源危險

4. docker events - 監控事件

 1# 實時監控 Docker 事件
 2docker events
 3
 4# 過濾特定類型的事件
 5docker events --filter type=container
 6docker events --filter type=image
 7docker events --filter type=network
 8
 9# 過濾特定容器的事件
10docker events --filter container=my-container
11
12# 過濾特定事件
13docker events --filter event=start
14docker events --filter event=die
15
16# 指定時間範圍
17docker events --since '2023-12-01'
18docker events --until '2023-12-31'
19
20# 格式化輸出
21docker events --format '{{json .}}'

5. docker stats - 資源使用統計

 1# 實時顯示容器資源使用
 2docker stats
 3
 4# 顯示特定容器
 5docker stats container1 container2
 6
 7# 不持續更新
 8docker stats --no-stream
 9
10# 不截斷容器 ID
11docker stats --no-trunc
12
13# 格式化輸出
14docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

stats 輸出欄位說明:

欄位說明
CONTAINER ID容器 ID
NAME容器名稱
CPU %CPU 使用百分比
MEM USAGE / LIMIT記憶體使用量 / 限制
MEM %記憶體使用百分比
NET I/O網路輸入/輸出
BLOCK I/O磁碟輸入/輸出
PIDS進程數量

🎯 Docker Compose 基礎指令

Docker Compose 是定義和運行多容器應用的工具。

基本指令對照表

指令說明範例
docker-compose up啟動服務docker-compose up -d
docker-compose down停止並刪除服務docker-compose down
docker-compose ps列出服務docker-compose ps
docker-compose logs查看日誌docker-compose logs -f
docker-compose exec在服務中執行指令docker-compose exec web bash
docker-compose build建立映像docker-compose build
docker-compose pull拉取映像docker-compose pull
docker-compose restart重啟服務docker-compose restart
docker-compose stop停止服務docker-compose stop
docker-compose start啟動服務docker-compose start

常用 Compose 操作

 1# 啟動所有服務(背景運行)
 2docker-compose up -d
 3
 4# 啟動特定服務
 5docker-compose up -d web database
 6
 7# 重新建立並啟動
 8docker-compose up -d --build
 9
10# 擴展服務(運行多個實例)
11docker-compose up -d --scale web=3
12
13# 查看服務狀態
14docker-compose ps
15
16# 查看服務日誌
17docker-compose logs -f
18docker-compose logs -f web  # 特定服務
19
20# 執行一次性指令
21docker-compose run web python manage.py migrate
22
23# 進入服務容器
24docker-compose exec web bash
25
26# 停止所有服務
27docker-compose stop
28
29# 停止並刪除容器(保留資料卷)
30docker-compose down
31
32# 刪除所有資源(包含資料卷)
33docker-compose down -v
34
35# 查看配置
36docker-compose config
37
38# 驗證配置檔
39docker-compose config --quiet

🛠️ 進階實用技巧

1. 批次操作範例

 1# 停止所有容器
 2docker stop $(docker ps -aq)
 3
 4# 刪除所有容器
 5docker rm $(docker ps -aq)
 6
 7# 刪除所有映像
 8docker rmi $(docker images -q)
 9
10# 刪除所有懸掛映像
11docker rmi $(docker images -f "dangling=true" -q)
12
13# 刪除特定名稱模式的容器
14docker rm $(docker ps -a | grep "test-" | awk '{print $1}')
15
16# 停止並刪除所有以 "dev-" 開頭的容器
17docker ps -a --filter "name=dev-" --format "{{.ID}}" | xargs docker rm -f

2. 容器調試技巧

 1# 查看容器進程
 2docker top container-name
 3
 4# 查看容器詳細資訊
 5docker inspect container-name | jq
 6
 7# 進入容器排查問題
 8docker exec -it container-name bash
 9
10# 查看容器檔案變更
11docker diff container-name
12
13# 實時查看日誌
14docker logs -f --tail 100 container-name
15
16# 複製檔案出來分析
17docker cp container-name:/path/to/file ./local-file
18
19# 查看容器資源使用
20docker stats container-name --no-stream

3. 映像優化檢查

 1# 分析映像層
 2docker history --no-trunc image-name:tag
 3
 4# 檢查映像大小
 5docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | \
 6  sort -k3 -h
 7
 8# 掃描安全漏洞
 9docker scan image-name:tag
10
11# 導出映像結構
12docker save image-name:tag -o image.tar
13tar -xvf image.tar

4. 效能監控

 1# 持續監控所有容器資源
 2docker stats
 3
 4# 監控特定容器
 5watch -n 1 "docker stats --no-stream container-name"
 6
 7# 容器事件監控
 8docker events --filter type=container
 9
10# 系統資源概覽
11docker system df -v
12
13# 詳細的容器資訊
14docker inspect container-name | jq '.State, .HostConfig.Resources'

5. 實用別名設定

 1# 添加到 ~/.bashrc 或 ~/.zshrc
 2
 3# Docker 快捷指令
 4alias d='docker'
 5alias dc='docker-compose'
 6alias dps='docker ps'
 7alias dpsa='docker ps -a'
 8alias di='docker images'
 9alias dex='docker exec -it'
10alias dlog='docker logs -f'
11alias dstop='docker stop $(docker ps -aq)'
12alias drm='docker rm $(docker ps -aq)'
13alias drmi='docker rmi $(docker images -q)'
14alias dprune='docker system prune -af --volumes'
15
16# Docker Compose 快捷指令
17alias dcup='docker-compose up -d'
18alias dcdown='docker-compose down'
19alias dclog='docker-compose logs -f'
20alias dcps='docker-compose ps'
21alias dcbuild='docker-compose up -d --build'

📊 指令速查表

容器操作

操作指令
運行容器docker run -d --name NAME IMAGE
列出容器docker ps / docker ps -a
停止容器docker stop NAME
啟動容器docker start NAME
重啟容器docker restart NAME
刪除容器docker rm NAME
進入容器docker exec -it NAME bash
查看日誌docker logs -f NAME
查看詳情docker inspect NAME
複製檔案docker cp NAME:/path ./path

映像操作

操作指令
列出映像docker images
搜尋映像docker search IMAGE
下載映像docker pull IMAGE:TAG
建立映像docker build -t NAME:TAG .
標記映像docker tag SOURCE TARGET
推送映像docker push NAME:TAG
刪除映像docker rmi IMAGE
查看歷史docker history IMAGE
保存映像docker save IMAGE > file.tar
載入映像docker load < file.tar

網路操作

操作指令
列出網路docker network ls
創建網路docker network create NAME
連接網路docker network connect NET CONTAINER
斷開網路docker network disconnect NET CONTAINER
查看詳情docker network inspect NAME
刪除網路docker network rm NAME

資料卷操作

操作指令
列出資料卷docker volume ls
創建資料卷docker volume create NAME
查看詳情docker volume inspect NAME
刪除資料卷docker volume rm NAME
清理資料卷docker volume prune

🎓 總結

本文詳細介紹了 Docker CLI 的各項指令,包括:

核心內容回顧

  1. 容器管理

    • 運行、停止、刪除容器
    • 日誌查看與調試
    • 資源監控與限制
  2. 映像管理

    • 搜尋、下載、建立映像
    • 映像標記與推送
    • 映像優化與清理
  3. 網路管理

    • 網路模式選擇
    • 自訂網路創建
    • 容器網路連接
  4. 資料卷管理

    • Volume 與 Bind Mount
    • 資料持久化策略
    • 備份與還原
  5. 系統維護

    • 資源清理
    • 效能監控
    • 故障排查

最佳實踐建議

  • 使用管理指令(docker container, docker image 等)提高可讀性
  • 為容器和映像使用有意義的命名
  • 定期清理未使用的資源
  • 使用 Volume 進行資料持久化
  • 生產環境使用自訂網路
  • 設定資源限制避免單一容器佔用過多資源

下一步

在第三篇文章中,我們將探討:

  • Dockerfile 最佳實踐與優化
  • 多階段建立詳解
  • Docker Compose 進階應用
  • 容器安全性配置
  • 生產環境部署策略
  • CI/CD 整合實踐

掌握這些 Docker 指令,您將能夠高效地管理容器化應用,為進階學習打下堅實的基礎!