# Docker Compose 使用教程

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序的服务,然后使用一个命令创建并启动所有服务。本教程将详细介绍 Docker Compose 的安装、配置和使用方法。

1. 什么是 Docker Compose

Docker Compose 允许你在一个 YAML 文件中定义所有服务,并通过简单的命令管理这些服务的整个生命周期。它特别适合开发环境、测试环境以及小型生产环境的部署。

主要优势:

  • 简化多容器应用的部署流程
  • 通过单一文件管理所有服务配置
  • 支持服务之间的依赖关系
  • 一键启动/停止整个应用堆栈
  • 支持开发环境与生产环境的配置分离
  • 2. 安装 Docker Compose

    Linux 系统

1. 下载最新版本的 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. 添加执行权限:

sudo chmod +x /usr/local/bin/docker-compose

3. 创建符号链接:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4. 验证安装:

docker-compose --version

macOS 和 Windows

Docker Desktop for Mac 和 Windows 已经内置了 Docker Compose,安装 Docker Desktop 后即可直接使用。

3. Docker Compose 基本概念

服务 (Service)

一个服务代表一个容器实例,可以包含多个运行相同镜像的容器。服务在 `docker-compose.yml` 文件中定义。

项目 (Project)

由一组关联的服务组成,通常对应一个完整的应用程序。

常用指令

  • `version`: 指定 Compose 文件格式版本
  • `services`: 定义各个服务
  • `volumes`: 数据卷配置
  • `networks`: 网络配置
  • `configs`: 配置文件
  • `secrets`: 敏感数据
  • 4. 创建第一个 Compose 项目

我们将创建一个简单的 Web 应用,包含:

  • 一个 Python Flask 应用
  • 一个 Redis 缓存服务
  • 项目结构

    my_project/
    ├── app.py
    ├── requirements.txt
    ├── docker-compose.yml
    └── Dockerfile

    创建应用文件 (app.py)

    from flask import Flask
    import redis
    import os
    
    app = Flask(__name__)
    redis_host = os.environ.get('REDIS_HOST', 'localhost')
    redis_client = redis.Redis(host=redis_host, port=6379)
    
    @app.route('/')
    def hello():
        count = redis_client.incr('hits')
        return f'Hello World! I have been seen {count} times.\n'
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=5000, debug=True)

    创建依赖文件 (requirements.txt)

    flask
    redis

    创建 Dockerfile

    FROM python:3.9-alpine
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD ["python", "app.py"]

    创建 docker-compose.yml

    version: '3.8'
    
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        environment:
          REDIS_HOST: redis
        depends_on:
          - redis
    
      redis:
        image: "redis:alpine"
        volumes:
          - redis_data:/data
    
    volumes:
      redis_data:

    5. 启动和管理服务

    启动服务

在项目目录下运行:

docker-compose up

后台运行

docker-compose up -d

查看服务状态

docker-compose ps

查看服务日志

docker-compose logs -f

停止服务

docker-compose down

停止并删除数据卷

docker-compose down -v

6. 高级配置选项

环境变量使用

在 `docker-compose.yml` 中使用环境变量:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "${WEB_PORT}:5000"
    environment:
      REDIS_HOST: redis
      APP_ENV: ${APP_ENV}

创建 `.env` 文件:

WEB_PORT=8080
APP_ENV=production

健康检查

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000/"]
      interval: 30s
      timeout: 10s
      retries: 3

网络配置

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    networks:
      - front-tier
      - back-tier

  redis:
    image: "redis:alpine"
    networks:
      - back-tier

networks:
  front-tier:
  back-tier:

数据卷挂载

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app    # 挂载当前目录到容器/app
      - static_volume:/app/static

  redis:
    image: "redis:alpine"
    volumes:
      - redis_data:/data

volumes:
  static_volume:
  redis_data:

7. 扩展服务规模

增加服务实例

docker-compose up --scale web=3

在 docker-compose.yml 中配置

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    deploy:
      replicas: 3

8. 生产环境注意事项

1. 安全配置:

  • 避免使用 root 用户运行容器
  • 使用非 root 镜像基础
  • 限制容器的 capabilities
  • 2. 资源限制:

    version: '3.8'
    
    services:
      web:
        build: .
        deploy:
          resources:
            limits:
              cpus: '0.50'
              memory: 512M
            reservations:
              cpus: '0.25'
              memory: 128M

    3. 日志管理:

    version: '3.8'
    
    services:
      web:
        build: .
        logging:
          driver: "json-file"
          options:
            max-size: "200k"
            max-file: "10"

    4. 使用 .env 文件:将环境变量与配置分离

    5. 多环境配置:使用多个 Compose 文件

    docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

    9. 实战案例:WordPress + MySQL

    docker-compose.yml

    version: '3.8'
    
    services:
      db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
    
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - wordpress_data:/var/www/html
    
    volumes:
      db_data:
      wordpress_data:

    启动

    docker-compose up -d

访问 `http://localhost:8000` 即可开始 WordPress 安装。

总结

Docker Compose 是一个强大而灵活的工具,通过声明式配置简化了多容器应用的部署和管理。它特别适合开发环境和小型生产环境的部署,能够显著提高开发效率。

本教程详细介绍了 Docker Compose 的安装、基本概念、项目创建、服务管理、高级配置以及生产环境注意事项。通过 Docker Compose,你可以:

  • 使用单一文件定义复杂的多容器应用
  • 简化开发、测试和部署流程
  • 轻松管理服务之间的依赖关系
  • 实现服务的快速扩展和缩减
  • 保持环境一致性

随着容器化技术的普及,掌握 Docker Compose 已成为现代软件开发和运维的必备技能。建议读者通过实际项目练习加深理解,并进一步探索 Docker Swarm 和 Kubernetes 等更高级的编排工具。

发表回复

后才能评论