Skip to content

Docker Compose 多容器应用管理

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

1. Docker Compose 简介

1.1 什么是 Docker Compose?

Docker Compose 是 Docker 官方提供的开源项目,用于简化多容器应用的部署和管理。使用 Compose 的三个基本步骤:

  1. 使用 Dockerfile 定义应用程序的环境
  2. 使用 docker-compose.yml 定义组成应用程序的服务
  3. 运行 docker-compose up 启动整个应用

1.2 为什么需要 Docker Compose?

  • 简化配置:通过声明式的 YAML 文件定义服务
  • 单一命令管理:使用简单命令启动、停止整个应用
  • 环境变量支持:轻松管理不同环境的配置
  • 网络自动化:自动创建网络,连接容器
  • 数据卷管理:简化数据持久化配置
  • 扩展能力:轻松进行服务伸缩

2. 安装 Docker Compose

2.1 在 Linux 上安装

bash
# 下载最新版本的 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

2.2 在 Windows/Mac 上安装

如果你安装了 Docker Desktop,它已经包含了 Docker Compose。

2.3 使用 pip 安装

bash
pip install docker-compose

3. Docker Compose 核心概念

3.1 docker-compose.yml 文件

docker-compose.yml 是 Docker Compose 的核心配置文件,采用 YAML 格式。一个简单的例子:

yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    depends_on:
      - redis
  redis:
    image: redis:alpine

3.2 主要配置选项

  • version:指定 Compose 文件格式版本
  • services:定义应用的各个服务(容器)
  • build:指定 Dockerfile 所在目录
  • image:指定镜像
  • ports:端口映射
  • volumes:数据卷挂载
  • depends_on:服务依赖关系
  • environment:环境变量设置
  • networks:网络配置
  • restart:重启策略

4. Docker Compose 常用命令

4.1 基本命令

bash
# 启动所有服务
docker-compose up

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

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

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 执行服务中的命令
docker-compose exec <service> <command>

4.2 构建与重建

bash
# 构建/重建服务
docker-compose build

# 仅构建指定服务
docker-compose build <service>

# 启动时强制重建
docker-compose up --build

4.3 服务管理

bash
# 启动特定服务
docker-compose up <service>

# 停止服务
docker-compose stop

# 启动服务
docker-compose start

# 重启服务
docker-compose restart

# 暂停服务
docker-compose pause

# 恢复服务
docker-compose unpause

4.4 服务伸缩

bash
# 扩展服务实例数量
docker-compose up -d --scale web=3 --scale worker=2

5. 实战案例

5.1 Web应用 + 数据库

创建一个包含 Node.js 应用和 MongoDB 数据库的多容器应用:

yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - MONGO_URL=mongodb://mongo:27017/myapp
    depends_on:
      - mongo
    volumes:
      - ./src:/app/src
    restart: always
  
  mongo:
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
    restart: always

volumes:
  mongo-data:

5.2 前后端分离应用

创建一个包含前端、后端API和数据库的完整应用环境:

yaml
version: '3'
services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: always
  
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=db
      - DB_USER=myuser
      - DB_PASSWORD=mypassword
      - DB_NAME=mydb
    depends_on:
      - db
    restart: always
  
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=mypassword
    volumes:
      - db-data:/var/lib/mysql
    restart: always

volumes:
  db-data:

5.3 开发环境工具集

创建一个包含多种开发工具的环境:

yaml
version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    ports:
      - "8080:8080"
    volumes:
      - jenkins-data:/var/jenkins_home
  
  sonarqube:
    image: sonarqube
    ports:
      - "9000:9000"
    volumes:
      - sonarqube-data:/opt/sonarqube/data
  
  gitlab:
    image: gitlab/gitlab-ce
    ports:
      - "443:443"
      - "80:80"
      - "22:22"
    volumes:
      - gitlab-config:/etc/gitlab
      - gitlab-logs:/var/log/gitlab
      - gitlab-data:/var/opt/gitlab

volumes:
  jenkins-data:
  sonarqube-data:
  gitlab-config:
  gitlab-logs:
  gitlab-data:

6. Docker Compose 高级特性

6.1 多环境配置

使用多个 Compose 文件管理不同环境:

  • docker-compose.yml - 基础配置
  • docker-compose.override.yml - 默认的开发环境配置
  • docker-compose.prod.yml - 生产环境配置
bash
# 使用生产环境配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

6.2 环境变量与 .env 文件

在项目根目录创建 .env 文件:

MYSQL_ROOT_PASSWORD=securepassword
EXTERNAL_PORT=8080

在 docker-compose.yml 中使用:

yaml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "${EXTERNAL_PORT}:80"

6.3 健康检查

yaml
services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

6.4 Docker Compose 与 Swarm 集成

如果你使用 Docker Swarm 进行容器编排,可以使用 Compose 文件部署服务:

bash
# 使用Compose文件部署Swarm服务
docker stack deploy -c docker-compose.yml myapp

7. 最佳实践

7.1 容器编排最佳实践

  • 单一职责:每个容器只运行一个服务
  • 无状态化:尽量避免在容器中存储状态
  • 环境配置外部化:使用环境变量或配置文件
  • 合理使用数据卷:确保数据持久化
  • 使用健康检查:提高应用的可靠性
  • 使用网络别名:简化服务间通信

7.2 docker-compose.yml 文件组织

  • 按照功能或依赖关系组织服务
  • 使用注释记录关键配置
  • 敏感信息使用环境变量
  • 公共配置提取为通用模板

7.3 性能优化

  • 优化 Docker 镜像大小
  • 合理配置资源限制
  • 使用适当的重启策略
  • 优化服务依赖关系

8. 常见问题排查

8.1 网络问题

bash
# 检查网络
docker network ls

# 查看服务网络设置
docker-compose config

# 检查容器网络连接
docker exec <container_id> ping <service_name>

8.2 卷挂载问题

bash
# 检查卷列表
docker volume ls

# 检查卷详情
docker volume inspect <volume_name>

8.3 日志分析

bash
# 查看所有服务日志
docker-compose logs

# 查看特定服务日志
docker-compose logs <service>

# 持续查看日志
docker-compose logs -f <service>

总结

Docker Compose 是管理多容器应用的强大工具,简化了开发、测试和生产环境的配置和部署过程。本文介绍了 Docker Compose 的基本概念、安装方法、实用命令和实战案例,希望能帮助你在项目中高效地使用 Docker Compose。

无论是开发小型项目还是构建复杂的微服务架构,Docker Compose 都能提供流畅的开发体验和简化的操作流程。掌握这一工具将大大提高你的 Docker 使用效率。