Compose 文件编写指南

Docker Compose 文件的完整配置指南


📋 目录


文件版本

version 字段

version: '3.8'

注意:新版本的 Docker Compose 可以省略 version 字段。

版本选择

  • 3.8:推荐使用,功能完整
  • 3.7:较旧版本
  • 2.x:旧版本格式

服务定义

基本服务

services:
  web:
    image: nginx:latest
    container_name: my-nginx
    ports:
      - "8080:80"

使用 Dockerfile 构建

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - VERSION=1.0.0

端口映射

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"           # 简单映射
      - "127.0.0.1:8080:80" # 指定 IP
      - "8443:443"          # 多个端口

环境变量

services:
  web:
    image: nginx:latest
    environment:
      - NODE_ENV=production
      - PORT=3000
    # 或使用字典格式
    environment:
      NODE_ENV: production
      PORT: 3000

使用 .env 文件

services:
  web:
    image: nginx:latest
    env_file:
      - .env
      - .env.production

网络配置

默认网络

services:
  web:
    image: nginx:latest
  db:
    image: postgres:13
# 自动创建默认网络,服务可以通过服务名通信

自定义网络

services:
  web:
    image: nginx:latest
    networks:
      - frontend
  db:
    image: postgres:13
    networks:
      - backend
 
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

网络配置选项

networks:
  my-network:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: my-bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

数据卷配置

命名数据卷

services:
  db:
    image: postgres:13
    volumes:
      - db-data:/var/lib/postgresql/data
 
volumes:
  db-data:
    driver: local

绑定挂载

services:
  web:
    image: nginx:latest
    volumes:
      - ./app:/app
      - ./config:/etc/nginx/conf.d:ro

临时文件系统

services:
  web:
    image: nginx:latest
    tmpfs:
      - /tmp
      - /var/cache

环境变量

在 Compose 文件中定义

services:
  web:
    image: nginx:latest
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/mydb

使用 .env 文件

# .env 文件
NODE_ENV=production
DATABASE_URL=postgres://db:5432/mydb
services:
  web:
    image: nginx:latest
    env_file:
      - .env

变量替换

services:
  web:
    image: nginx:${VERSION:-latest}
    ports:
      - "${PORT:-8080}:80"

依赖关系

depends_on

services:
  web:
    image: nginx:latest
    depends_on:
      - db
      - redis
 
  db:
    image: postgres:13
 
  redis:
    image: redis:latest

健康检查依赖

services:
  web:
    image: nginx:latest
    depends_on:
      db:
        condition: service_healthy
 
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

配置变量与模板

使用变量

version: '3.8'
 
services:
  web:
    image: ${IMAGE_NAME:-nginx}:${IMAGE_TAG:-latest}
    ports:
      - "${HOST_PORT:-8080}:80"

环境变量文件

# .env
IMAGE_NAME=nginx
IMAGE_TAG=latest
HOST_PORT=8080

条件配置

services:
  web:
    image: nginx:latest
    # 使用条件配置
    deploy:
      replicas: ${REPLICAS:-1}

完整示例

Web 应用 + 数据库 + Redis

version: '3.8'
 
services:
  web:
    build: .
    ports:
      - "${HOST_PORT:-8080}:80"
    depends_on:
      - db
      - redis
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
      - REDIS_URL=redis://redis:6379
    networks:
      - app-network
 
  db:
    image: postgres:13
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD:-password}
      - POSTGRES_DB=${DB_NAME:-mydb}
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
 
  redis:
    image: redis:latest
    networks:
      - app-network
 
networks:
  app-network:
    driver: bridge
 
volumes:
  db-data:

📚 参考资源


相关笔记