Docker 基本指令
映像檔管理:
# 搜尋映像檔
docker search nginx
docker search ubuntu
# 下載映像檔
docker pull nginx
docker pull nginx:1.21
docker pull ubuntu:20.04
# 列出映像檔
docker images
docker image ls
# 移除映像檔
docker rmi nginx
docker rmi nginx:1.21
docker image rm ubuntu:20.04
# 清理未使用的映像檔
docker image prune
docker image prune -a # 移除所有未使用的映像檔
容器操作
啟動容器:
# 基本啟動
docker run nginx
docker run -d nginx # 背景執行
docker run -it ubuntu bash # 互動模式
# 埠對應
docker run -d -p 8080:80 nginx # 對應埠 8080 到容器的 80
docker run -d -p 127.0.0.1:8080:80 nginx # 只綁定本機
# 掛載目錄
docker run -d -v /host/path:/container/path nginx
docker run -d -v $(pwd):/app node # 掛載當前目錄
# 環境變數
docker run -d -e ENV_VAR=value nginx
docker run -d --env-file .env nginx
# 容器命名
docker run -d --name my-nginx nginx
容器管理:
# 列出容器
docker ps # 運行中的容器
docker ps -a # 所有容器
docker container ls
# 停止容器
docker stop container_id
docker stop my-nginx
docker kill container_id # 強制停止
# 啟動已停止的容器
docker start container_id
docker restart container_id
# 移除容器
docker rm container_id
docker rm my-nginx
docker rm -f container_id # 強制移除運行中的容器
# 清理停止的容器
docker container prune
容器互動與除錯
# 進入運行中的容器
docker exec -it container_id bash
docker exec -it my-nginx sh
# 查看容器日誌
docker logs container_id
docker logs -f container_id # 即時查看日誌
docker logs --tail 100 container_id # 查看最後 100 行
# 查看容器資訊
docker inspect container_id
docker stats container_id # 即時資源使用情況
docker top container_id # 容器內程序
# 複製檔案
docker cp file.txt container_id:/path/ # 複製到容器
docker cp container_id:/path/file.txt . # 從容器複製出來
# 查看容器變更
docker diff container_id
Docker Compose
基本指令:
# 啟動服務
docker-compose up
docker-compose up -d # 背景執行
docker-compose up --build # 重新建置映像檔
# 停止服務
docker-compose down
docker-compose down -v # 同時移除 volumes
docker-compose stop
# 查看服務狀態
docker-compose ps
docker-compose logs
docker-compose logs -f service_name # 查看特定服務日誌
# 執行指令
docker-compose exec service_name bash
docker-compose run service_name command
# 重啟服務
docker-compose restart
docker-compose restart service_name
範例 docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
映像檔建置 (Dockerfile)
基本 Dockerfile:
# Node.js 應用程式範例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
USER node
CMD ["npm", "start"]
建置指令:
# 建置映像檔
docker build -t my-app .
docker build -t my-app:v1.0 .
docker build -f Dockerfile.prod -t my-app:prod .
# 多階段建置
docker build --target production -t my-app:prod .
# 建置時傳入參數
docker build --build-arg NODE_ENV=production -t my-app .
# 查看建置歷史
docker history my-app
Docker 網路
# 列出網路
docker network ls
# 建立網路
docker network create my-network
docker network create --driver bridge my-bridge
# 連接容器到網路
docker network connect my-network container_id
# 中斷網路連接
docker network disconnect my-network container_id
# 查看網路詳細資訊
docker network inspect my-network
# 移除網路
docker network rm my-network
# 清理未使用的網路
docker network prune
Docker Volumes
# 列出資料卷
docker volume ls
# 建立資料卷
docker volume create my-volume
# 查看資料卷詳細資訊
docker volume inspect my-volume
# 使用資料卷
docker run -d -v my-volume:/data nginx
# 移除資料卷
docker volume rm my-volume
# 清理未使用的資料卷
docker volume prune
# 備份資料卷
docker run --rm -v my-volume:/data -v $(pwd):/backup ubuntu tar czf /backup/backup.tar.gz -C /data .
# 還原資料卷
docker run --rm -v my-volume:/data -v $(pwd):/backup ubuntu tar xzf /backup/backup.tar.gz -C /data
Docker 系統清理
# 查看 Docker 使用空間
docker system df
# 清理未使用的資源
docker system prune # 清理停止的容器、未使用的網路、映像檔
docker system prune -a # 包含未使用的映像檔
docker system prune -a --volumes # 包含未使用的資料卷
# 分別清理
docker container prune # 清理停止的容器
docker image prune # 清理未使用的映像檔
docker image prune -a # 清理所有未使用的映像檔
docker network prune # 清理未使用的網路
docker volume prune # 清理未使用的資料卷
# 強制移除所有容器
docker rm -f $(docker ps -aq)
# 移除所有映像檔
docker rmi -f $(docker images -q)
Docker Registry
# 登入 Registry
docker login
docker login registry.example.com
docker login -u username -p password registry.example.com
# 標記映像檔
docker tag my-app:latest registry.example.com/my-app:latest
docker tag my-app:latest harbor.company.com/project/my-app:v1.0
# 推送映像檔
docker push registry.example.com/my-app:latest
docker push harbor.company.com/project/my-app:v1.0
# 從私有 Registry 拉取
docker pull harbor.company.com/project/my-app:v1.0
# 登出
docker logout
docker logout registry.example.com