← 返回首页
🐳

Docker Compose多容器编排

📂 devops ⏱ 2 min 245 words

Docker Compose多容器编排

什么是Docker Compose

Docker Compose是一个用于定义和运行多容器Docker应用的工具。使用YAML文件配置应用的服务、网络和卷。

安装Docker Compose

# Linux
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

基本语法

docker-compose.yml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend
    depends_on:
      - api

  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - DB_PORT=3306
    networks:
      - frontend
      - backend
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend

volumes:
  db_data:

networks:
  frontend:
  backend:

常用命令

基本操作

# 启动所有服务
docker-compose up

# 后台启动
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看服务状态
docker-compose ps

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

# 重启服务
docker-compose restart web

构建和扩展

# 构建镜像
docker-compose build

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

# 扩展服务
docker-compose up --scale web=3

# 查看构建日志
docker-compose build --no-cache

服务配置详解

环境变量

services:
  api:
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    env_file:
      - .env

端口映射

services:
  web:
    ports:
      - "80:80"           # 主机:容器
      - "127.0.0.1:8080:80"  # 绑定IP

卷挂载

services:
  api:
    volumes:
      - ./src:/app/src         # 绑定挂载
      - node_modules:/app/node_modules  # 命名卷
      - /tmp/cache:/tmp/cache  # 匿名卷

volumes:
  node_modules:

实践:完整Web应用

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - static_files:/app/static
    depends_on:
      - api
    networks:
      - frontend

  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    environment:
      - NODE_ENV=production
      - REDIS_URL=redis://redis:6379
      - DATABASE_URL=mysql://db:3306/mydb
    networks:
      - frontend
      - backend
    depends_on:
      - redis
      - db

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data
    networks:
      - backend

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend
    secrets:
      - db_root_password

volumes:
  static_files:
  redis_data:
  db_data:

networks:
  frontend:
  backend:

secrets:
  db_root_password:
    file: ./secrets/db_root_password.txt

多环境配置

docker-compose.override.yml

# 开发环境配置
version: '3.8'

services:
  api:
    volumes:
      - ./api/src:/app/src
    environment:
      - NODE_ENV=development
    command: npm run dev

生产环境

# 使用生产配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

总结

Docker Compose简化了多容器应用的管理。通过声明式配置,可以轻松定义和运行复杂的微服务架构。