使用 Dockerfile 与 Docker Compose 结合的完整流程
Dockerfile 用于定义单个容器的构建过程,而 Docker Compose 则用于编排多个容器。以下是结合使用两者的完整方法:
1. 创建 Dockerfile
在项目目录中创建 Dockerfile
定义应用镜像的构建过程:
dockerfile
# 使用官方Python 3.6.8镜像
FROM python:3.6.8-slim
WORKDIR /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 1
CMD ["python", "/app/HsSignalQa/server.py"]
2. 创建 docker-compose.yml
在相同目录下创建 docker-compose.yml
文件:
yaml
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. 完整工作流程
构建并启动服务
bash
# 构建镜像并启动所有服务
docker-compose up --build
# 后台运行模式
docker-compose up -d --build
Docker-compose.yml 文件详解
Docker-compose.yml 是 Docker Compose 的核心配置文件,用于定义和运行多容器 Docker 应用程序。以下是该文件的详细解析:
1. 文件结构概览
yaml
version: '3.8' # 指定 compose 文件版本
services: # 定义服务的容器
service1: # 第一个服务
image: ... # 服务配置
service2: # 第二个服务
build: ... # 服务配置
networks: # 定义网络
some-network:
volumes: # 定义数据卷
some-volume:
2. 主要配置项详解
version (必选)
指定 compose 文件格式版本,与 Docker Engine 版本兼容性相关:
yaml
version: '3.8' # 推荐使用 3.x 系列的最新版
services (必选)
定义应用程序的各个服务(容器):
基本配置
yaml
services:
webapp:
image: nginx:1.21-alpine # 使用现成镜像
# 或
build: . # 使用 Dockerfile 构建
build:
context: ./dir # 构建上下文路径
dockerfile: Dockerfile-alternate # 指定 Dockerfile
args: # 构建参数
buildno: 1
container_name: my-webapp # 自定义容器名
restart: unless-stopped # 重启策略(no, always, on-failure, unless-stopped)
网络与端口
yaml
ports:
- "80:80" # 主机端口:容器端口
- "443:443"
- "3000-3005:3000-3005" # 端口范围
expose:
- "3000" # 仅暴露给其他容器不映射到主机
networks:
- frontend
- backend
环境变量
yaml
environment:
NODE_ENV: production
DATABASE_URL: postgres://user:pass@db:5432/db
# 或使用文件
env_file:
- .env
- .env.dev
数据持久化
yaml
volumes:
- /var/lib/mysql # 匿名卷
- ./data:/var/lib/mysql # 绑定挂载
- db_data:/var/lib/mysql # 命名卷
- config:/etc/config:ro # 只读挂载
volumes_from:
- service_name # 使用其他服务的卷
依赖与健康检查
yaml
depends_on:
- db
- redis
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
资源限制
yaml
deploy: # 仅在使用 docker stack deploy 时有效
resources:
limits:
cpus: '0.50'
memory: 500M
reservations:
memory: 200M
# 或直接使用(适用于 docker-compose up)
mem_limit: 512m
cpu_shares: 73
volumes (可选)
定义数据卷,用于持久化数据:
yaml
volumes:
db_data: # 命名卷
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.1,rw
metrics: # 外部已有卷
external: true
name: metrics_data
networks (可选)
定义自定义网络:
yaml
networks:
frontend:
driver: bridge
driver_opts:
com.docker.network.bridge.name: my-frontend
backend:
external: true
name: my-existing-network
3. 完整示例
yaml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
depends_on:
- redis
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
volumes:
redis_data:
postgres_data:
networks:
backend:
driver: bridge
4. 高级配置
扩展字段
yaml
x-common-env: &common-env
TZ: Asia/Shanghai
LANG: en_US.UTF-8
services:
app1:
environment:
<<: *common-env
APP_SPECIFIC: value
条件配置
yaml
services:
service:
image: nginx
profiles:
- debug
# 使用 docker-compose --profile debug up 启动
标签和元数据
yaml
labels:
com.example.description: "Webapp service"
com.example.department: "IT"
通过合理配置这些选项,您可以精确控制容器化应用的运行方式,实现开发、测试和生产环境的一致部署。