🎯 前言
在上一篇文章中,我們了解了 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 ps | docker container ls | 列出容器 |
docker images | docker image ls | 列出映像 |
docker rm | docker container rm | 刪除容器 |
docker rmi | docker image rm | 刪除映像 |
docker inspect | docker 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 |
--cpus | CPU 限制 | 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 stop | SIGTERM → SIGKILL | 10 秒(可調整) | 正常停止容器 |
docker kill | SIGKILL | 立即 | 強制終止容器 |
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 exec | docker 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 | 系統日誌 | 集中式日誌管理 |
journald | systemd journal | systemd 環境 |
gelf | Graylog Extended Log Format | Graylog、Logstash |
fluentd | Fluentd 日誌收集 | 大規模日誌聚合 |
awslogs | AWS CloudWatch | AWS 環境 |
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 的各項指令,包括:
核心內容回顧
容器管理
- 運行、停止、刪除容器
- 日誌查看與調試
- 資源監控與限制
映像管理
- 搜尋、下載、建立映像
- 映像標記與推送
- 映像優化與清理
網路管理
- 網路模式選擇
- 自訂網路創建
- 容器網路連接
資料卷管理
- Volume 與 Bind Mount
- 資料持久化策略
- 備份與還原
系統維護
- 資源清理
- 效能監控
- 故障排查
最佳實踐建議
- 使用管理指令(
docker container
,docker image
等)提高可讀性 - 為容器和映像使用有意義的命名
- 定期清理未使用的資源
- 使用 Volume 進行資料持久化
- 生產環境使用自訂網路
- 設定資源限制避免單一容器佔用過多資源
下一步
在第三篇文章中,我們將探討:
- Dockerfile 最佳實踐與優化
- 多階段建立詳解
- Docker Compose 進階應用
- 容器安全性配置
- 生產環境部署策略
- CI/CD 整合實踐
掌握這些 Docker 指令,您將能夠高效地管理容器化應用,為進階學習打下堅實的基礎!