LeiTao
LeiTao
发布于 2026-10-10 / 21 阅读
0
0

Docker Compose 入门指南:多容器编排

Docker Compose 入门指南:多容器编排

一、什么是 Docker Compose

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过一个 docker-compose.yml 文件来配置应用程序需要的所有服务、网络和数据卷,然后用一条命令即可启动所有服务。

安装

# 下载二进制文件
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 Desktop 已内置 Docker Compose,无需单独安装。


二、docker-compose.yml 核心语法

基本结构

version: "3.9"  # Compose 文件格式版本

services:        # 定义服务
  web:
    image: nginx:1.25-alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: ./app
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
    ports:
      - "5000:80"

volumes:         # 定义数据卷
  data:

networks:        # 定义网络
  frontend:
  backend:

三、常用配置项

1. 服务构建

services:
  app:
    build:
      context: ./app          # 构建上下文路径
      dockerfile: Dockerfile  # 指定 Dockerfile
      args:                    # 构建参数
        VERSION: v1
    image: myapp:latest        # 构建后的镜像名

2. 端口映射

services:
  web:
    ports:
      - "8080:80"       # 宿主机端口:容器端口
      - "443:443"
      - "127.0.0.1:3306:3306"  # 限制访问地址

3. 环境变量

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
    # 或使用文件
    env_file:
      - .env

4. 数据卷挂载

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql           # 命名卷
      - ./config/my.cnf:/etc/mysql/conf.d/my.cnf  # 绑定挂载

volumes:
  db_data:

5. 健康检查

services:
  db:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

6. 重启策略

services:
  app:
    restart: unless-stopped  # no / always / unless-stopped / on-failure

7. 资源限制

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          memory: 256M

四、常用命令

# 启动所有服务(前台)
docker-compose up

# 启动所有服务(后台)
docker-compose up -d

# 构建并启动(重新构建镜像)
docker-compose up -d --build

# 停止并删除所有容器、网络
docker-compose down

# 停止并删除所有容器、网络、数据卷
docker-compose down -v

# 查看运行中的服务
docker-compose ps

# 查看日志
docker-compose logs -f --tail=100

# 进入容器
docker-compose exec app /bin/sh

# 重启某个服务
docker-compose restart app

# 查看配置(解析后输出)
docker-compose config

五、实战示例:.NET Core + MySQL + Nginx

version: "3.9"

services:
  # MySQL 数据库
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 5

  # .NET Core 应用
  app:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ConnectionStrings__Default=Server=db;Database=appdb;User=root;Password=rootpass;
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "5000:80"
    restart: unless-stopped

  # Nginx 反向代理
  nginx:
    image: nginx:1.25-alpine
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
    depends_on:
      - app
    restart: unless-stopped

volumes:
  db_data:

六、多环境配置

Docker Compose 支持多文件覆盖:

# 基础配置 docker-compose.yml
# 开发覆盖 docker-compose.override.yml(自动加载)
# 生产覆盖 docker-compose.prod.yml

# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

生产环境覆盖示例(docker-compose.prod.yml)

version: "3.9"
services:
  app:
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 1G
    restart: always

最佳实践:始终将 docker-compose.yml 纳入版本控制,使用 .env 文件管理敏感信息,用多文件覆盖区分不同环境。


评论