使用 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"
通过合理配置这些选项,您可以精确控制容器化应用的运行方式,实现开发、测试和生产环境的一致部署。