Docker 常用指令

Docker 是容器化技術的核心工具,掌握其常用指令對於日常開發和運維工作至關重要。本指南將介紹最實用的 Docker 指令,並提供詳細的使用說明和範例。


映像檔管理

檢視映像檔

1
2
3
4
5
6
7
8
9
10
11
# 列出所有本地映像檔
docker images

# 列出特定映像檔
docker images nginx

# 顯示映像檔詳細資訊
docker image inspect nginx:latest

# 查看映像檔層級歷史
docker history nginx:latest

搜尋和下載映像檔

1
2
3
4
5
6
7
8
9
10
11
# 搜尋 Docker Hub 上的映像檔
docker search nginx

# 下載映像檔
docker pull nginx:latest

# 下載特定版本
docker pull nginx:1.21

# 下載所有標籤版本
docker pull nginx --all-tags

建構映像檔

1
2
3
4
5
6
7
8
9
10
11
# 從 Dockerfile 建構映像檔
docker build -t myapp:latest .

# 指定 Dockerfile 路徑
docker build -f /path/to/Dockerfile -t myapp:latest .

# 傳遞建構參數
docker build --build-arg VERSION=1.0 -t myapp:latest .

# 不使用快取建構
docker build --no-cache -t myapp:latest .

標記和推送映像檔

1
2
3
4
5
6
7
8
9
10
11
# 為映像檔加上標籤
docker tag myapp:latest registry.example.com/myapp:v1.0

# 推送映像檔到註冊中心
docker push registry.example.com/myapp:v1.0

# 登入註冊中心
docker login registry.example.com

# 登出
docker logout registry.example.com

刪除映像檔

1
2
3
4
5
6
7
8
9
10
11
# 刪除特定映像檔
docker rmi nginx:latest

# 強制刪除映像檔
docker rmi -f nginx:latest

# 刪除所有懸空映像檔(dangling images)
docker image prune

# 刪除所有未使用的映像檔
docker image prune -a

容器管理

運行容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基本運行
docker run nginx

# 背景運行
docker run -d nginx

# 指定容器名稱
docker run --name my-nginx -d nginx

# 端口映射
docker run -p 8080:80 -d nginx

# 環境變數
docker run -e ENV=production -d nginx

# 掛載資料卷
docker run -v /host/path:/container/path -d nginx

# 臨時運行(停止後自動刪除)
docker run --rm nginx

# 互動式運行
docker run -it ubuntu bash

檢視容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 列出運行中的容器
docker ps

# 列出所有容器(包括停止的)
docker ps -a

# 顯示容器詳細資訊
docker inspect container_name

# 查看容器統計資訊
docker stats

# 查看特定容器統計
docker stats container_name

# 查看容器程序
docker top container_name

容器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 啟動停止的容器
docker start container_name

# 停止運行中的容器
docker stop container_name

# 重啟容器
docker restart container_name

# 暫停容器
docker pause container_name

# 恢復暫停的容器
docker unpause container_name

# 強制終止容器
docker kill container_name

進入容器

1
2
3
4
5
6
7
8
9
10
11
# 在運行中的容器執行命令
docker exec -it container_name bash

# 執行特定命令
docker exec container_name ls -la

# 以 root 身份進入容器
docker exec -u root -it container_name bash

# 附加到容器的主程序
docker attach container_name

刪除容器

1
2
3
4
5
6
7
8
9
10
11
# 刪除停止的容器
docker rm container_name

# 強制刪除運行中的容器
docker rm -f container_name

# 刪除所有停止的容器
docker container prune

# 停止並刪除所有容器
docker stop $(docker ps -q) && docker rm $(docker ps -aq)

日誌和監控

查看日誌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看容器日誌
docker logs container_name

# 實時跟蹤日誌
docker logs -f container_name

# 查看最近的日誌
docker logs --tail 100 container_name

# 顯示日誌時間戳
docker logs -t container_name

# 查看特定時間範圍的日誌
docker logs --since 2023-01-01 container_name
docker logs --until 2023-12-31 container_name

監控和診斷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看容器資源使用情況
docker stats container_name

# 查看容器內程序
docker top container_name

# 檢查容器變更
docker diff container_name

# 查看端口映射
docker port container_name

# 檢查容器健康狀態
docker inspect --format='{{.State.Health.Status}}' container_name

網路管理

網路操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 列出所有網路
docker network ls

# 檢視網路詳細資訊
docker network inspect bridge

# 建立自定義網路
docker network create my-network

# 建立特定類型的網路
docker network create --driver bridge my-bridge-network

# 將容器連接到網路
docker network connect my-network container_name

# 從網路中斷開容器
docker network disconnect my-network container_name

# 刪除網路
docker network rm my-network

# 清理未使用的網路
docker network prune

網路使用範例

1
2
3
4
5
6
7
8
9
10
11
# 在自定義網路中運行容器
docker run -d --network my-network --name web nginx

# 運行時指定 IP 位址
docker run -d --network my-network --ip 172.18.0.10 --name web nginx

# 公開所有端口
docker run -d -P nginx

# 查看容器 IP 位址
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name

資料卷管理

資料卷操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 列出所有資料卷
docker volume ls

# 建立資料卷
docker volume create my-volume

# 檢視資料卷詳細資訊
docker volume inspect my-volume

# 刪除資料卷
docker volume rm my-volume

# 清理未使用的資料卷
docker volume prune

使用資料卷

1
2
3
4
5
6
7
8
9
10
11
# 使用命名資料卷
docker run -v my-volume:/app/data nginx

# 使用綁定掛載
docker run -v /host/path:/container/path nginx

# 唯讀掛載
docker run -v /host/path:/container/path:ro nginx

# 建立匿名資料卷
docker run -v /container/path nginx

系統管理

系統資訊

1
2
3
4
5
6
7
8
9
10
11
12
# 查看 Docker 版本
docker --version
docker version

# 查看系統資訊
docker info

# 查看磁盤使用情況
docker system df

# 詳細的磁盤使用情況
docker system df -v

系統清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 清理所有未使用的資源
docker system prune

# 包括未使用的映像檔
docker system prune -a

# 強制清理(不提示確認)
docker system prune -f

# 清理特定類型的資源
docker container prune # 停止的容器
docker image prune # 懸空映像檔
docker network prune # 未使用的網路
docker volume prune # 未使用的資料卷

事件監控

1
2
3
4
5
6
7
8
# 監控 Docker 事件
docker events

# 過濾特定事件
docker events --filter container=my-container

# 查看歷史事件
docker events --since 2023-01-01

實用組合指令

批次操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 停止所有運行中的容器
docker stop $(docker ps -q)

# 刪除所有容器
docker rm $(docker ps -aq)

# 刪除所有映像檔
docker rmi $(docker images -q)

# 刪除所有懸空映像檔
docker rmi $(docker images -f "dangling=true" -q)

# 按條件刪除容器
docker rm $(docker ps -a -f status=exited -q)

格式化輸出

1
2
3
4
5
6
7
8
9
10
11
# 自定義輸出格式
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# 只顯示容器 ID
docker ps -q

# 只顯示容器名稱
docker ps --format "{{.Names}}"

# 檢視映像檔大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

最佳實踐

安全性

1
2
3
4
5
6
7
8
9
10
11
# 以非 root 使用者運行
docker run --user 1000:1000 nginx

# 限制容器權限
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

# 使用唯讀檔案系統
docker run --read-only nginx

# 設定安全配置
docker run --security-opt no-new-privileges nginx

資源限制

1
2
3
4
5
6
7
8
9
10
11
# 限制記憶體使用
docker run -m 512m nginx

# 限制 CPU 使用
docker run --cpus="1.5" nginx

# 限制 CPU 核心
docker run --cpuset-cpus="0,1" nginx

# 組合資源限制
docker run -m 512m --cpus="1.0" nginx

日誌管理

1
2
3
4
5
6
7
8
# 設定日誌驅動
docker run --log-driver json-file --log-opt max-size=10m nginx

# 禁用日誌
docker run --log-driver none nginx

# 設定日誌輪替
docker run --log-opt max-size=10m --log-opt max-file=3 nginx

故障排除

常見問題診斷

1
2
3
4
5
6
7
8
9
10
11
12
13
# 檢查容器為何退出
docker logs container_name
docker inspect container_name | grep -A 5 State

# 檢查映像檔層級
docker history image_name

# 檢查容器內部
docker exec -it container_name /bin/sh

# 複製檔案到/從容器
docker cp container_name:/path/to/file /host/path
docker cp /host/path container_name:/path/to/file

除錯技巧

1
2
3
4
5
6
7
8
9
10
# 在失敗的容器基礎上啟動新容器進行除錯
docker commit failed_container debug_image
docker run -it debug_image /bin/bash

# 檢查網路連接
docker exec container_name ping google.com
docker exec container_name nslookup google.com

# 檢查端口監聽
docker exec container_name netstat -tlnp

快速參考表

基本指令對照

功能 指令 說明
運行容器 docker run 創建並啟動新容器
列出容器 docker ps 顯示運行中的容器
停止容器 docker stop 優雅停止容器
刪除容器 docker rm 刪除停止的容器
列出映像檔 docker images 顯示本地映像檔
刪除映像檔 docker rmi 刪除映像檔
查看日誌 docker logs 查看容器日誌
進入容器 docker exec 在運行中容器執行命令

常用參數

參數 功能 範例
-d 背景運行 docker run -d nginx
-it 互動式終端 docker run -it ubuntu bash
-p 端口映射 docker run -p 8080:80 nginx
-v 資料卷掛載 docker run -v /data:/app nginx
-e 環境變數 docker run -e NODE_ENV=prod node
--name 指定容器名稱 docker run --name web nginx
--rm 停止後自動刪除 docker run --rm nginx
-f 強制執行 docker rm -f container

提示
使用 docker --helpdocker COMMAND --help 可以隨時查看指令的詳細說明

重要
在生產環境中,建議始終指定映像檔標籤,避免使用 latest 標籤

警告
使用 docker system prune -a 會刪除所有未使用的映像檔,請謹慎使用