目錄
- 基本資訊
- Image 管理
- Container 管理
- Volume 管理
- Network 管理
- Docker Compose
- 系統管理
- Registry 操作
- Dockerfile 常用指令
- 實用組合指令
- 除錯指令
- 總結
基本資訊
# 查看 Docker 版本
docker --version
docker version
# 查看 Docker 資訊
docker info
# 查看說明
docker --help
docker <指令> --help
Image(映像檔)管理
搜尋與下載
# 搜尋 image
docker search nginx
docker search --filter stars=100 nginx # 篩選星星數
# 下載 image
docker pull nginx
docker pull nginx:latest # 指定標籤
docker pull nginx:1.21 # 指定版本
# 從其他 registry 下載
docker pull ghcr.io/user/image:tag
查看 Image
# 列出本地所有 image
docker images
docker image ls
# 顯示詳細資訊
docker images -a # 包含中繼層
docker images --no-trunc # 顯示完整 ID
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看 image 詳細資訊
docker inspect nginx
# 查看 image 歷史
docker history nginx
刪除 Image
# 刪除單個 image
docker rmi nginx
docker rmi nginx:1.21
docker image rm nginx
# 刪除多個 image
docker rmi nginx redis mysql
# 強制刪除
docker rmi -f nginx
# 刪除未使用的 image
docker image prune
docker image prune -a # 刪除所有未使用的
# 刪除所有 image
docker rmi $(docker images -q)
建立 Image
# 從 Dockerfile 建立
docker build -t myapp:1.0 .
docker build -t myapp:latest .
docker build -f Dockerfile.prod -t myapp:prod .
# 指定 build context
docker build -t myapp:1.0 ./app
# 不使用快取
docker build --no-cache -t myapp:1.0 .
# 設定 build argument
docker build --build-arg VERSION=1.0 -t myapp .
# 從 container 建立 image
docker commit container-name myapp:1.0
匯出與匯入
# 儲存 image 為檔案
docker save nginx > nginx.tar
docker save -o nginx.tar nginx
# 載入 image 檔案
docker load < nginx.tar
docker load -i nginx.tar
# 匯出 container 為 image
docker export container-name > container.tar
# 匯入為 image
docker import container.tar myapp:1.0
標籤與推送
# 標籤 image
docker tag myapp:1.0 myapp:latest
docker tag myapp:1.0 username/myapp:1.0
# 推送到 Docker Hub
docker login # 先登入
docker push username/myapp:1.0
docker push username/myapp:latest
# 登出
docker logout
Container(容器)管理
執行 Container
# 基本執行
docker run nginx
docker run -d nginx # 背景執行
docker run --name my-nginx nginx # 指定名稱
# 埠號映射
docker run -d -p 8080:80 nginx # 主機:容器
docker run -d -p 127.0.0.1:8080:80 nginx # 指定 IP
docker run -d -P nginx # 隨機埠號
# 環境變數
docker run -e MYSQL_ROOT_PASSWORD=secret mysql
docker run -e NODE_ENV=production myapp
# 掛載 Volume
docker run -v /host/path:/container/path nginx
docker run -v myvolume:/data nginx
# 掛載當前目錄
docker run -v $(pwd):/app myapp
# 唯讀掛載
docker run -v /host/path:/container/path:ro nginx
# 互動模式
docker run -it ubuntu bash # 互動式終端
docker run -it --rm ubuntu bash # 結束後自動刪除
# 網路設定
docker run --network mynetwork nginx
docker run --network host nginx # 使用主機網路
# 資源限制
docker run -m 512m nginx # 限制記憶體
docker run --cpus 2 nginx # 限制 CPU
# 重啟政策
docker run --restart always nginx # 總是重啟
docker run --restart unless-stopped nginx
docker run --restart on-failure nginx
# 組合範例
docker run -d \
--name my-nginx \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
-e NGINX_HOST=example.com \
--restart unless-stopped \
nginx:latest
查看 Container
# 列出執行中的 container
docker ps
docker container ls
# 列出所有 container(包含停止的)
docker ps -a
docker ps -a --no-trunc # 顯示完整資訊
# 只顯示 ID
docker ps -q
docker ps -aq
# 顯示最近建立的
docker ps -l # 最後一個
docker ps -n 5 # 最近 5 個
# 查看 container 詳細資訊
docker inspect container-name
# 查看 container 統計資訊
docker stats # 所有 container
docker stats container-name # 指定 container
# 查看 container 內的程序
docker top container-name
# 查看埠號映射
docker port container-name
管理執行中的 Container
# 停止 container
docker stop container-name
docker stop container1 container2 # 停止多個
docker stop $(docker ps -q) # 停止所有
# 啟動已停止的 container
docker start container-name
# 重啟 container
docker restart container-name
# 暫停/取消暫停
docker pause container-name
docker unpause container-name
# 強制停止
docker kill container-name
# 等待 container 停止
docker wait container-name
刪除 Container
# 刪除已停止的 container
docker rm container-name
# 強制刪除執行中的 container
docker rm -f container-name
# 刪除多個 container
docker rm container1 container2
# 刪除所有已停止的 container
docker container prune
# 刪除所有 container
docker rm -f $(docker ps -aq)
與 Container 互動
# 進入執行中的 container
docker exec -it container-name bash
docker exec -it container-name sh # 如果沒有 bash
# 執行單一指令
docker exec container-name ls /app
docker exec container-name cat /etc/hosts
# 以 root 身份執行
docker exec -u root -it container-name bash
# Attach 到 container(連接到主程序)
docker attach container-name
# 從 stdin 輸入
docker attach --sig-proxy=false container-name
查看日誌
# 查看 container 日誌
docker logs container-name
# 即時查看(追蹤)
docker logs -f container-name
# 顯示時間戳記
docker logs -t container-name
# 只顯示最後 N 行
docker logs --tail 100 container-name
# 顯示特定時間後的日誌
docker logs --since 2024-01-01 container-name
docker logs --since 1h container-name # 最近 1 小時
複製檔案
# 從 container 複製到主機
docker cp container-name:/path/file.txt ./
# 從主機複製到 container
docker cp ./file.txt container-name:/path/
# 複製目錄
docker cp container-name:/app ./backup
Volume(資料卷)管理
建立與查看
# 建立 volume
docker volume create myvolume
# 列出所有 volume
docker volume ls
# 查看 volume 詳細資訊
docker volume inspect myvolume
使用 Volume
# 掛載 volume
docker run -v myvolume:/data nginx
# 建立並掛載 volume
docker run -v newvolume:/data nginx
# 匿名 volume
docker run -v /data nginx
# 查看 container 使用的 volume
docker inspect -f '{{ .Mounts }}' container-name
刪除 Volume
# 刪除 volume
docker volume rm myvolume
# 刪除未使用的 volume
docker volume prune
# 刪除所有 volume(危險!)
docker volume rm $(docker volume ls -q)
Network(網路)管理
建立與查看
# 列出網路
docker network ls
# 查看網路詳細資訊
docker network inspect bridge
# 建立網路
docker network create mynetwork
docker network create --driver bridge mynetwork
docker network create --subnet 172.18.0.0/16 mynetwork
連接網路
# 連接 container 到網路
docker network connect mynetwork container-name
# 中斷連接
docker network disconnect mynetwork container-name
# 執行時指定網路
docker run --network mynetwork nginx
刪除網路
# 刪除網路
docker network rm mynetwork
# 刪除未使用的網路
docker network prune
Docker Compose
基本操作
# 啟動服務(背景執行)
docker-compose up -d
# 前景執行(看日誌)
docker-compose up
# 指定檔案
docker-compose -f docker-compose.yml up -d
# 重新建立 container
docker-compose up -d --build
# 強制重新建立
docker-compose up -d --force-recreate
管理服務
# 停止服務
docker-compose stop
# 停止並刪除 container
docker-compose down
# 停止並刪除 container、volume
docker-compose down -v
# 停止並刪除 container、volume、image
docker-compose down -v --rmi all
# 查看服務狀態
docker-compose ps
# 查看日誌
docker-compose logs
docker-compose logs -f # 即時追蹤
docker-compose logs service-name # 指定服務
# 執行指令
docker-compose exec service-name bash
docker-compose exec web npm install
# 重啟服務
docker-compose restart
docker-compose restart service-name
# 暫停/取消暫停服務
docker-compose pause
docker-compose unpause
建立與推送
# 建立 image
docker-compose build
# 重新建立(不使用快取)
docker-compose build --no-cache
# 推送 image
docker-compose push
# Pull image
docker-compose pull
擴展服務
# 擴展服務數量
docker-compose up -d --scale web=3
# 查看服務
docker-compose ps
查看與驗證
# 驗證 compose 檔案
docker-compose config
# 查看 compose 版本
docker-compose version
# 查看服務的環境變數
docker-compose config --services
系統管理
清理資源
# 清理未使用的資源(container、network、image)
docker system prune
# 包含 volume
docker system prune -a --volumes
# 強制清理(不確認)
docker system prune -f
# 查看磁碟使用
docker system df
docker system df -v # 詳細資訊
事件與監控
# 查看 Docker 事件
docker events
# 即時查看
docker events --since 1h
# 篩選特定類型
docker events --filter type=container
docker events --filter event=start
Registry 操作
# 登入 registry
docker login
docker login registry.example.com
# 登出
docker logout
# 搜尋 image
docker search ubuntu
# 推送 image
docker push username/image:tag
# Pull image
docker pull username/image:tag
Dockerfile 常用指令
# 基礎 image
FROM node:18-alpine
# 設定工作目錄
WORKDIR /app
# 複製檔案
COPY package.json .
COPY . .
# 執行指令
RUN npm install
RUN npm run build
# 設定環境變數
ENV NODE_ENV=production
ENV PORT=3000
# 開放埠號
EXPOSE 3000
# 設定 volume
VOLUME /data
# 設定使用者
USER node
# 設定啟動指令
CMD ["npm", "start"]
# 或
ENTRYPOINT ["node"]
CMD ["app.js"]
# 設定標籤
LABEL version="1.0"
LABEL maintainer="your@email.com"
# 健康檢查
HEALTHCHECK \
CMD curl -f http://localhost/ || exit 1
# Build argument
ARG VERSION=latest
.dockerignore 範例
# Node.js
node_modules
npm-debug.log
# Git
.git
.gitignore
# Docker
Dockerfile
docker-compose.yml
.dockerignore
# 文件
README.md
*.md
# 測試
test
*.test.js
coverage
# 環境變數
.env
.env.local
# IDE
.vscode
.idea
# 日誌
logs
*.log
# 暫存檔案
*.tmp
*.swp
Docker Compose 範例
基本結構
version: '3.8'
services:
# Web 服務
web:
build: .
image: myapp:latest
container_name: myapp-web
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
volumes:
- ./app:/app
- /app/node_modules
depends_on:
- db
- redis
restart: unless-stopped
networks:
- mynetwork
# 資料庫
db:
image: postgres:15-alpine
container_name: myapp-db
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- mynetwork
# Redis
redis:
image: redis:7-alpine
container_name: myapp-redis
networks:
- mynetwork
volumes:
db-data:
networks:
mynetwork:
driver: bridge
完整範例(含更多選項)
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
args:
- VERSION=1.0
image: myapp:latest
container_name: myapp-web
hostname: web
ports:
- "3000:3000"
expose:
- "3000"
environment:
NODE_ENV: production
DB_HOST: db
env_file:
- .env
volumes:
- ./app:/app
- logs:/var/log
depends_on:
db:
condition: service_healthy
restart: unless-stopped
networks:
mynetwork:
ipv4_address: 172.20.0.10
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '1'
memory: 512M
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- mynetwork
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
volumes:
db-data:
driver: local
logs:
driver: local
networks:
mynetwork:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
實用組合指令
# 停止並刪除所有 container
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# 刪除所有未使用的資源
docker system prune -a --volumes -f
# 查看所有 container 的 IP
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# 查看 container 佔用的磁碟空間
docker ps -s
# 進入最新建立的 container
docker exec -it $(docker ps -lq) bash
# 備份 volume
docker run --rm -v myvolume:/source -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /source .
# 還原 volume
docker run --rm -v myvolume:/target -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /target
# 查看 container 的環境變數
docker exec container-name env
# 查看 image 的層次結構
docker history --no-trunc image-name
除錯指令
# 查看 container 為什麼停止
docker logs container-name
docker inspect container-name | grep -A 10 State
# 查看 container 的資源使用
docker stats container-name --no-stream
# 查看 network 連接
docker network inspect bridge
# 測試 network 連通性
docker run --rm --network mynetwork alpine ping container-name
# 查看 volume 位置
docker volume inspect myvolume | grep Mountpoint
# 進入 volume 目錄
docker run --rm -v myvolume:/data alpine ls -la /data
效能優化
# 使用 BuildKit 加速建立
DOCKER_BUILDKIT=1 docker build -t myapp .
# 多階段建立(在 Dockerfile)
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/main.js"]
# 限制資源
docker run -m 512m --cpus 1 myapp
# 使用本地快取
docker build --cache-from myapp:latest -t myapp:new .
安全最佳實踐
# 不使用 root 執行
docker run -u 1000:1000 myapp
# 唯讀檔案系統
docker run --read-only myapp
# 限制權限
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
# 掃描漏洞
docker scan myapp:latest
# 使用 secrets(Compose)
docker-compose --env-file .env.secret up -d
總結
核心要點
- Docker 指令分為 Image、Container、Volume、Network 四大類
- 使用
-d背景執行,-it互動模式,-p映射 Port - 定期使用
prune指令清理未使用的資源 - 善用組合指令提高效率
快速參考
| 類別 | 常用指令 | 說明 |
|---|---|---|
| Image | docker pull / docker build |
下載 / 建立 |
| Container | docker run / docker ps |
執行 / 查看 |
| Volume | docker volume create / ls |
建立 / 列表 |
| Network | docker network create / ls |
建立 / 列表 |
| 清理 | docker system prune |
清理資源 |
建立日期:2025-10-28 最後更新:2025-11-18