使用 Dockerfile 與 Docker Compose 結合的完整流程
Dockerfile 用于定義單個容器的構建過程,而 Docker Compose 則用于編排多個容器。以下是結合使用兩者的完整方法:
1. 創建 Dockerfile
在項目目錄中創建 Dockerfile
定義應用鏡像的構建過程:
# 使用官方Python 3.6.8鏡像
FROM python:3.6.8-slimWORKDIR /app# 復制依賴文件
COPY requirements.txt .RUN pip install --upgrade pip
# 檢查并安裝依賴(自動處理未安裝的包)
RUN pip install --no-cache-dir -r requirements.txt || \{ echo "Failed to install some packages. Retrying with --upgrade..." && \pip install --no-cache-dir --upgrade -r requirements.txt; }# 復制應用代碼
COPY . .# 添加健康檢查(驗證Python環境)
HEALTHCHECK --interval=30s --timeout=10s \CMD python -c "import sys; from pkg_resources import require; require(open('requirements.txt').read())" || exit 1CMD ["python", "/app/HsSignalQa/server.py"]
2. 創建 docker-compose.yml
在相同目錄下創建 docker-compose.yml
文件:
version: '3.3'services:your-python-service: # 你的服務名稱build: .container_name: hsrg-signal-container # 可選:自定義容器名稱networks:znsxnet:aliases:- hsrg-signal # 設置網絡別名ports:- "4000:8000" # 端口映射volumes:- .:/app # 掛載代碼目錄environment:- FLASK_ENV=production# 其他環境變量...networks:znsxnet:external: true # 使用已存在的網絡
3. 完整工作流程
構建并啟動服務
# 構建鏡像并啟動所有服務
docker-compose up --build# 后臺運行模式
docker-compose up -d --build
Docker-compose.yml 文件詳解
Docker-compose.yml 是 Docker Compose 的核心配置文件,用于定義和運行多容器 Docker 應用程序。以下是該文件的詳細解析:
1. 文件結構概覽
version: '3.8' # 指定 compose 文件版本services: # 定義服務的容器service1: # 第一個服務image: ... # 服務配置service2: # 第二個服務build: ... # 服務配置networks: # 定義網絡some-network:volumes: # 定義數據卷some-volume:
2. 主要配置項詳解
version (必選)
指定 compose 文件格式版本,與 Docker Engine 版本兼容性相關:
version: '3.8' # 推薦使用 3.x 系列的最新版
services (必選)
定義應用程序的各個服務(容器):
基本配置
services:webapp:image: nginx:1.21-alpine # 使用現成鏡像# 或build: . # 使用 Dockerfile 構建build:context: ./dir # 構建上下文路徑dockerfile: Dockerfile-alternate # 指定 Dockerfileargs: # 構建參數buildno: 1container_name: my-webapp # 自定義容器名restart: unless-stopped # 重啟策略(no, always, on-failure, unless-stopped)
網絡與端口
ports:- "80:80" # 主機端口:容器端口- "443:443"- "3000-3005:3000-3005" # 端口范圍expose:- "3000" # 僅暴露給其他容器不映射到主機networks:- frontend- backend
環境變量
environment:NODE_ENV: productionDATABASE_URL: postgres://user:pass@db:5432/db# 或使用文件env_file:- .env- .env.dev
數據持久化
volumes:- /var/lib/mysql # 匿名卷- ./data:/var/lib/mysql # 綁定掛載- db_data:/var/lib/mysql # 命名卷- config:/etc/config:ro # 只讀掛載volumes_from:- service_name # 使用其他服務的卷
依賴與健康檢查
depends_on:- db- redishealthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3start_period: 40s
資源限制
deploy: # 僅在使用 docker stack deploy 時有效resources:limits:cpus: '0.50'memory: 500Mreservations:memory: 200M# 或直接使用(適用于 docker-compose up)mem_limit: 512mcpu_shares: 73
volumes (可選)
定義數據卷,用于持久化數據:
volumes:db_data: # 命名卷driver: localdriver_opts:type: nfso: addr=192.168.1.1,rwmetrics: # 外部已有卷external: truename: metrics_data
networks (可選)
定義自定義網絡:
networks:frontend:driver: bridgedriver_opts:com.docker.network.bridge.name: my-frontendbackend:external: truename: my-existing-network
3. 完整示例
version: '3.8'services:web:build: .ports:- "5000:5000"volumes:- .:/codeenvironment:FLASK_ENV: developmentdepends_on:- redisredis:image: redis:alpineports:- "6379:6379"volumes:- redis_data:/datahealthcheck:test: ["CMD", "redis-cli", "ping"]interval: 10stimeout: 5sretries: 3database:image: postgres:13environment:POSTGRES_PASSWORD: examplevolumes:- postgres_data:/var/lib/postgresql/datanetworks:- backendvolumes:redis_data:postgres_data:networks:backend:driver: bridge
4. 高級配置
擴展字段
x-common-env: &common-envTZ: Asia/ShanghaiLANG: en_US.UTF-8services:app1:environment:<<: *common-envAPP_SPECIFIC: value
條件配置
services:service:image: nginxprofiles:- debug# 使用 docker-compose --profile debug up 啟動
標簽和元數據
labels:com.example.description: "Webapp service"com.example.department: "IT"
通過合理配置這些選項,您可以精確控制容器化應用的運行方式,實現開發、測試和生產環境的一致部署。