使用 Dockerfile 与 Docker Compose 结合+Docker-compose.yml 文件详解

使用 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"

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