Docker CLI
Common Flags
| Flag | Description |
|---|---|
-d | 背景執行 |
-p host:container | 連接埠映射 |
-it | 互動式終端機 |
--name | 指定容器名稱 |
--network | 指定網路 |
--rm | 停止時自動移除 |
-e key=value | 設定環境變數 |
--env-file | 使用環境檔案 |
Container Management
run
建立並啟動容器。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d --name nginx-server -p 80:80 nginx
docker run -it ubuntu /bin/bash互動模式:
docker run -i/-it [容器]環境變數設定:
docker run -e 參數=數值 [鏡像]使用環境檔案:
docker run -d -p 8080:80 --env-file .env [鏡像]start / stop / restart
# 啟動已存在的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start nginx-server
# 停止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop nginx-server
docker stop $(docker ps -a -q) # 停止所有容器
# 重新啟動容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker restart nginx-serverpause / unpause
# 暫停容器
docker pause CONTAINER [CONTAINER...]
docker pause nginx-server
# 恢復暫停的容器
docker unpause CONTAINER [CONTAINER...]
docker unpause nginx-serverrm
移除容器。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm nginx-server
docker rm -f nginx-server # 強制刪除exec
在容器中執行指令。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it nginx-server /bin/bash
docker exec -u root nginx-server whoami
docker exec -it [容器] bash # 互動式 shellcp
在容器和主機間複製檔案。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp nginx-server:/etc/nginx/nginx.conf ./nginx.confcommit / export / import
# 建立容器快照
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit nginx-server my-nginx:v1.0
# 匯出容器為 tar 檔案
docker export [OPTIONS] CONTAINER
docker export nginx-server > nginx-backup.tar
# 從 tar 檔案匯入為映像檔
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import nginx-backup.tar my-nginx:restoredattach
附加到執行中的容器。
docker attach [容器]container update
更新現有容器設定。
docker container update --publish <主機埠>:<容器埠> <容器名稱或ID>Image Commands
images / image ls
列出映像檔。
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker images
docker images --filter "dangling=true"
docker image ls
docker image prune -a # 移除未使用的鏡像search / pull / push
# 搜尋映像檔
docker search [OPTIONS] TERM
docker search nginx
# 下載映像檔
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull nginx:latest
docker pull ubuntu:20.04
# 上傳映像檔
docker push [OPTIONS] NAME[:TAG]
docker push my-registry.com/my-image:latestrmi
移除映像檔。
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi nginx:latest
docker rmi -f $(docker images -q) # 刪除所有映像檔
docker rmi -f $(docker images -aq) # 移除所有鏡像tag
給本地已有的 image 指定一個新的名字或標籤。
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag nginx:latest my-nginx:v1.0
docker tag hello-docker lexyu/hello-dockerbuild
從 Dockerfile 構建鏡像。
docker build [OPTIONS] PATH | URL | -
docker build -t my-app:latest .
docker build -f Dockerfile.prod -t my-app:prod .
docker build --no-cache -t my-app:latest .
docker build . -t my-simple-webhistory / inspect
# 映像檔歷史
docker history [OPTIONS] IMAGE
docker history nginx:latest
# 檢查映像檔詳細資訊
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect nginx:latest
# 獲取特定 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器]save / load
# 儲存映像檔為 tar 檔案
docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o nginx.tar nginx:latest
docker save [選項] [鏡像] > [檔案名].tar
# 從 tar 檔案載入映像檔
docker load [OPTIONS]
docker load -i nginx.tarInformation & Monitoring
ps
列出容器。
docker ps [OPTIONS]
docker ps # 執行中容器
docker ps -a # 所有容器
docker ps -q # 只顯示容器 ID
docker ps -aq # 所有容器 ID
docker ps --filter "status=exited"logs
查看容器日誌。
docker logs [OPTIONS] CONTAINER
docker logs nginx-server
docker logs -f nginx-server # 即時追蹤
docker logs --tail 100 nginx-serverstats / top / diff
# 容器統計資訊
docker stats [OPTIONS] [CONTAINER...]
docker stats
docker stats nginx-server
# 容器進程
docker top CONTAINER [ps OPTIONS]
docker top nginx-server
# 容器變更
docker diff CONTAINER
docker diff nginx-serverSystem Information
# 系統資訊
docker system info
docker info
# 磁碟使用量
docker system df
docker system df -v
# 系統事件
docker system events [OPTIONS]
docker events
docker events --filter container=nginx-server
# 版本資訊
docker version
docker --versionNetwork Management
# 列出網路
docker network ls
# 建立網路
docker network create [OPTIONS] NETWORK
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --driver bridge --subnet 182.18.0.1/24 --gateway 182.18.0.1 [網路名稱]
# 檢查網路詳細資訊
docker network inspect [OPTIONS] NETWORK [NETWORK...]
docker network inspect my-network
# 連接容器到網路
docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect my-network nginx-server
# 斷開容器網路連接
docker network disconnect [OPTIONS] NETWORK CONTAINER
docker network disconnect my-network nginx-server
# 刪除網路
docker network rm NETWORK [NETWORK...]
docker network rm my-network
# 清理未使用的網路
docker network prune [OPTIONS]
docker network prune -fVolume Management
# 列出儲存卷
docker volume ls
# 建立儲存卷
docker volume create [OPTIONS] [VOLUME]
docker volume create my-volume
# 檢查儲存卷詳細資訊
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
docker volume inspect my-volume
# 刪除儲存卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]
docker volume rm my-volume
# 清理未使用的儲存卷
docker volume prune [OPTIONS]
docker volume prune -f
# persist data
docker run -v /opt/data:/var/lib/mysql mysql
# mount
docker run --mount type=bind,source=/主機路徑,target=/容器路徑 [鏡像]Registry Operations
# 登入登錄庫
docker login [OPTIONS] [SERVER]
docker login
docker login my-registry.com
# 登出登錄庫
docker logout [SERVER]
docker logout
docker logout my-registry.com
# 部署私有註冊表伺服器
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 推送到私有註冊表
docker tag [鏡像] localhost:5000/[鏡像]
docker push localhost:5000/[鏡像]
# 驗證註冊表內容
curl -X GET localhost:5000/v2/_catalogSystem Maintenance
# 清理系統
docker system prune [OPTIONS]
docker system prune -f # 清理停止的容器、未使用的網路、映像檔
docker system prune -a -f # 清理所有未使用的資源
# 清理特定資源
docker container prune [OPTIONS] # 清理停止的容器
docker image prune [OPTIONS] # 清理未使用的映像檔
docker network prune [OPTIONS] # 清理未使用的網路
docker volume prune [OPTIONS] # 清理未使用的儲存卷Docker Run Options
# 基本選項
-d, --detach # 背景執行
-i, --interactive # 保持 STDIN 開啟
-t, --tty # 分配偽終端機
--name string # 容器名稱
--rm # 容器停止時自動刪除
# 網路選項
-p, --publish list # 發布埠號
-P, --publish-all # 發布所有埠號
--network string # 連接到網路
# 儲存選項
-v, --volume list # 掛載儲存卷
--mount mount # 掛載檔案系統
-w, --workdir string # 工作目錄
# 資源限制
-m, --memory bytes # 記憶體限制
--cpus decimal # CPU 限制
--memory-swap bytes # 記憶體 + Swap 限制
# 環境變數
-e, --env list # 設定環境變數
--env-file list # 從檔案讀取環境變數
# 重啟策略
--restart string # 重啟策略 (no|on-failure|always|unless-stopped)Resource Limited
# CPU
docker run -cpus=.5 ubuntu
# Memory
docker run -memory=100m ubuntuSleep
docker run ubuntu:latest sleep 10Docker Swarm
init
docker swarm init --advertise-addr 192.168.1.12
Service
For docker swarm,must execute command on manager node.
docker service create --replicas=3 my-web-serverdocker service create --replicas=3 -p 8080:80 --network frontend my-web-serverdocker service create --replicas=3 --network frontend my-web-server
Tool Combinations
grep
# 過濾容器名稱
docker ps | grep nginx
docker ps -a | grep "Exited"
# 過濾映像檔
docker images | grep ubuntu
docker images | grep -v "none"
# 過濾日誌
docker logs nginx-server | grep "error"
docker logs nginx-server | grep -i "warning"
# 過濾網路
docker network ls | grep bridgeawk
# 提取容器 ID
docker ps | awk '{print $1}'
docker ps -a | awk 'NR>1 {print $1}'
# 提取容器名稱
docker ps | awk '{print $NF}'
docker ps --format "table {{.Names}}\t{{.Status}}"
# 計算映像檔大小
docker images | awk 'NR>1 {sum+=$7} END {print "Total size: " sum " MB"}'
# 提取特定欄位
docker ps | awk '{print $2, $NF}' # 映像檔名稱和容器名稱sed
# 移除標頭
docker ps | sed '1d'
# 替換文字
docker ps | sed 's/CONTAINER/Container/'
# 提取特定行
docker ps | sed -n '2,5p' # 顯示第 2-5 行xargs
# 停止所有容器
docker ps -q | xargs docker stop
# 刪除所有停止的容器
docker ps -aq --filter "status=exited" | xargs docker rm
# 刪除未標記的映像檔
docker images -f "dangling=true" -q | xargs docker rmi
# 批次執行指令
docker ps --format "{{.Names}}" | xargs -I {} docker logs {}
# stop all container and remove all
docker ps -aq | xargs docker stop | xargs docker rmjq
# 格式化 inspect 輸出
docker inspect nginx-server | jq '.[0].Config.Env'
docker inspect nginx-server | jq '.[0].NetworkSettings.IPAddress'
# 提取特定資訊
docker inspect $(docker ps -q) | jq '.[] | {Name: .Name, Status: .State.Status}'Complex Command Examples
# 停止並刪除所有容器
docker stop $(docker ps -q) && docker rm $(docker ps -aq)
# 刪除所有未使用的資源
docker system prune -a -f && docker volume prune -f
# 查看最佔用記憶體的容器
docker stats --no-stream | sort -k4 -hr | head -5
# 查看容器啟動時間並排序
docker ps --format "table {{.Names}}\t{{.Status}}" | sort -k2
# 監控特定容器的 CPU 使用率
watch -n 1 "docker stats --no-stream | grep nginx-server"
# 查找大於 100MB 的映像檔
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | \
awk '$3 ~ /[0-9]+GB|[1-9][0-9][0-9]+MB/'
# 批次重啟包含特定名稱的容器
docker ps --format "{{.Names}}" | grep "web" | xargs docker restart
# 查看容器的環境變數
docker ps --format "{{.Names}}" | \
xargs -I {} sh -c 'echo "=== {} ==="; docker exec {} env'Performance Monitoring
# 即時監控所有容器資源使用
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 查看容器檔案系統變更
docker ps -q | xargs -I {} sh -c 'echo "=== {} ==="; docker diff {}'
# 監控容器網路流量
docker exec nginx-server cat /proc/net/dev
# 查看容器進程樹
docker ps --format "{{.Names}}" | xargs -I {} docker exec {} ps auxLog Analysis
# 分析錯誤日誌
docker logs nginx-server 2>&1 | grep -i error | wc -l
# 提取時間範圍內的日誌
docker logs nginx-server --since "2024-01-01T00:00:00" --until "2024-01-02T00:00:00"
# 分析訪問日誌統計
docker logs nginx-server | awk '{print $1}' | sort | uniq -c | sort -nr
# 即時監控多個容器日誌
docker ps --format "{{.Names}}" | grep "web" | \
xargs -I {} bash -c 'docker logs -f {} > {}.log 2>&1 &'Format Docker Info
export FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nImage\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
docker ps --format=$FORMAT可至 ~/.docker 底下 config.json 加入設定,永久變更:
{
"psFormat": "ID\t{{.ID}}\nNAME\t{{.Names}}\nImage\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
}Casual Notes
MQ
RabbitMQ
docker pull rabbitmq:4.0.4-managementdocker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0.4-managementDatabases
Redis:
docker run -p 6379:6379 -v "{PATH}/redis":/data -v "{PATH}/redis/redis.conf":/usr/local/etc/redis/redis.conf redislabs/redismod:latestMySQL:
docker run --name mysql-container \
-e MYSQL_USER=root \
-e MYSQL_ROOT_PASSWORD=p@ssw0rd \
-p 3307:3306 \
-v "{PATH}":/var/lib/mysql \
-d mysql:latestPostgres:
docker run --name postgres-container \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=p@ssw0rd \
-p 5432:5432 \
-v "{PATH}":/var/lib/postgresql/data \
-d postgres:latest