Docker CLI

Common Flags

FlagDescription
-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-server

pause / unpause

# 暫停容器
docker pause CONTAINER [CONTAINER...]
docker pause nginx-server

# 恢復暫停的容器
docker unpause CONTAINER [CONTAINER...]
docker unpause nginx-server

rm

移除容器。

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    # 互動式 shell

cp

在容器和主機間複製檔案。

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.conf

commit / 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:restored

attach

附加到執行中的容器。

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:latest

rmi

移除映像檔。

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-docker

build

從 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-web

history / 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.tar

Information & 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-server

stats / 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-server

System 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 --version

Network 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 -f

Volume 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/_catalog

System 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 ubuntu

Sleep

docker run ubuntu:latest sleep 10

Docker Swarm

init

docker swarm init --advertise-addr 192.168.1.12
Docker Swarm Setup

Service

For docker swarm,must execute command on manager node.

docker service create --replicas=3 my-web-server
docker service create --replicas=3 -p 8080:80 --network frontend my-web-server
docker service create --replicas=3 --network frontend my-web-server
Docker Swarm Service

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 bridge

awk

# 提取容器 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 rm

jq

# 格式化 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 aux

Log 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-management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0.4-management

Databases

Redis:

docker run -p 6379:6379 -v "{PATH}/redis":/data -v "{PATH}/redis/redis.conf":/usr/local/etc/redis/redis.conf redislabs/redismod:latest

MySQL:

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:latest

Postgres:

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