Skip to content

Docker Compose

多容器应用的定义与编排工具

核心概念

Docker Compose 通过 docker-compose.yml 文件定义和运行多容器应用。

yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  mysql-data:

networks:
  app-network:
    driver: bridge

常用命令

bash
# 启动(后台运行)
docker compose up -d

# 启动并重新构建
docker compose up -d --build

# 停止并删除
docker compose down

# 停止并删除卷
docker compose down -v

# 查看日志
docker compose logs
docker compose logs -f

# 查看服务状态
docker compose ps

# 执行命令
docker compose exec app ls -la

# 扩容
docker compose up -d --scale app=3

# 查看资源
docker compose top

服务配置详解

build 配置

yaml
services:
  app:
    build:
      context: ./src
      dockerfile: Dockerfile.prod
      args:
        - NODE_ENV=production
    image: myapp:latest  # 构建后的镜像名

ports 端口映射

yaml
services:
  app:
    ports:
      - "8080:3000"        # 主机:容器
      - "9090:3001"        # 多个端口
      - "127.0.0.1:8080:3000"  # 绑定特定 IP

environment 环境变量

yaml
services:
  app:
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      # 或使用对象形式
    environment:
      NODE_ENV: production
      DB_HOST: ${DB_HOST:-db}  # 支持默认值

depends_on 依赖关系

yaml
services:
  app:
    depends_on:
      - db
      - redis
    # 等待依赖就绪(v2.1+)
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 5

volumes 数据卷

yaml
services:
  app:
    volumes:
      - ./src:/app/src      # 绑定挂载
      - app-data:/app/data  # 命名卷
      - /host/config:/config:ro  # 只读

volumes:
  app-data:

networks 网络

yaml
services:
  app:
    networks:
      - frontend
      - backend

networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
  backend:
    driver: bridge

restart 策略

yaml
services:
  app:
    restart: always      # 总是重启
    # restart: on-failure  # 失败时重启
    # restart: unless-stopped  # 除非手动停止

多环境配置

环境变量文件

bash
# .env
DB_PASSWORD=secret
REDIS_HOST=redis
yaml
# docker-compose.yml
services:
  app:
    environment:
      DB_PASSWORD: ${DB_PASSWORD}

多配置文件

├── docker-compose.yml      # 基础配置
├── docker-compose.dev.yml  # 开发环境
├── docker-compose.prod.yml # 生产环境
└── docker-compose.override.yml  # 开发覆盖
bash
# 使用特定配置
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

开发与生产分离

yaml
# docker-compose.yml (通用)
services:
  app:
    build: .
    environment:
      - NODE_ENV=${NODE_ENV}

# docker-compose.dev.yml (开发)
services:
  app:
    volumes:
      - ./src:/app/src
    environment:
      - NODE_ENV=development
    command: npm run dev

# docker-compose.prod.yml (生产)
services:
  app:
    command: npm start
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

完整示例:前端应用

yaml
version: '3.8'

services:
  # 前端开发
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
    command: npm run dev
    networks:
      - app-network

  # 后端 API
  api:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "4000:4000"
    environment:
      - NODE_ENV=development
      - DB_HOST=db
      - REDIS_HOST=redis
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    networks:
      - app-network

  # 数据库
  db:
    image: mysql:8
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  # 缓存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-network

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - frontend
      - api
    networks:
      - app-network

volumes:
  mysql-data:
  redis-data:

networks:
  app-network:
    driver: bridge

面试高频题

Q1: Docker Compose 的作用是什么?

答案:

  • 定义和管理多容器应用
  • 通过 YAML 文件配置服务
  • 一键启动/停止整个应用
  • 支持环境变量、多配置文件

Q2: depends_on 的作用和限制?

答案:

  • 作用:定义服务依赖关系,确保启动顺序
  • 限制(旧版本):仅等待容器启动,不等待服务就绪
  • 解决方案(v2.1+):使用 condition: service_healthy + healthcheck

Q3: docker-compose up --scale 的作用?

答案:

  • 扩容服务实例数量
  • 用于负载均衡和高可用
bash
docker compose up -d --scale app=3

Q4: docker-compose vs Kubernetes?

特性Docker ComposeKubernetes
规模单主机跨集群
复杂度简单复杂
功能基础编排完整容器编排平台
适用开发/测试生产环境

前端面试知识库