一、Compose 核心概念与价值
(一)多容器管理痛点
在微服务架构中,单个应用通常由多个容器组成(如Web服务+数据库+缓存),手动管理存在以下问题:
- 环境不一致:各容器启动顺序、依赖关系难以维护
- 部署效率低:需逐个启动容器并配置网络映射
- 配置复杂:端口映射、数据卷挂载需重复操作
(二)Compose 解决方案
Compose 是 Docker 官方提供的多容器编排工具,通过 YAML 文件定义应用的完整架构,实现:
- 一键部署:通过 docker-compose up 启动所有服务
- 依赖管理:自动处理服务间的启动顺序和网络连接
- 环境标准化:通过配置文件确保开发、测试、生产环境一致
(三)Compose 工作流程
- 定义环境:使用 Dockerfile 构建服务镜像
- 配置服务:通过 docker-compose.yml 定义服务间关系
- 启动应用:执行 docker-compose up 启动全栈服务
二、安装与环境准备
(一)Linux 系统安装
1. 官方二进制包安装
# 下载最新稳定版本(替换v2.2.2为最新版本号)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软链接(可选)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2. 国内加速安装
# 利用DaoCloud镜像加速
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 验证安装
docker-compose version
# 输出示例:docker-compose version 1.29.2, build 5becea4c
(二)macOS 与 Windows 安装
- macOS:Docker Desktop 已内置 Compose,无需额外安装
- Windows:Docker Desktop 或 Toolbox 已包含 Compose,直接使用
三、快速入门实战案例
(一)项目结构准备
# 创建项目目录
mkdir composetest && cd composetest
# 创建 app.py 文件(Flask 应用)
cat > app.py << 'EOF'
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
EOF
# 创建 requirements.txt
echo "flask\nredis" > requirements.txt
(二)定义 Dockerfile
# 基础镜像使用轻量级的 Python Alpine 版本
FROM python:3.7-alpine
# 设置工作目录
WORKDIR /code
# 配置环境变量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
# 安装编译依赖(用于Python扩展)
RUN apk add --no-cache gcc musl-dev linux-headers
# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 定义容器启动命令
CMD ["flask", "run"]
(三)编写 docker-compose.yml
# 指定Compose文件版本
version: '3'
services:
# Web服务定义
web:
# 从当前目录的Dockerfile构建镜像
build: .
# 映射容器5000端口到宿主机5000端口
ports:
- "5000:5000"
# 依赖redis服务
depends_on:
- redis
# Redis服务定义
redis:
# 使用官方Redis Alpine镜像
image: "redis:alpine"
(四)启动应用
# 前台启动(显示日志)
docker-compose up
# 后台启动(守护进程模式)
docker-compose up -d
# 查看运行中的服务
docker-compose ps
(五)访问应用
浏览器访问: http://localhost:5000
输出示例: Hello World! I have been seen 1 times.
四、compose.yml 配置详解
(一)核心配置段
1. version 版本声明
# 建议使用3.7及以上版本,兼容Docker Swarm
version: '3.7'
2. services 服务定义
services:
web:
build: .
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
(二)服务配置参数
参数 | 示例 | 说明 |
build | build: . | 构建镜像的上下文路径,可包含Dockerfile路径和参数 |
image | image: redis:alpine | 指定使用的镜像(优先于build) |
ports | ports: - "8080:80" | 端口映射(宿主机:容器) |
volumes | volumes: - ./data:/app/data | 数据卷挂载(宿主机路径:容器路径) |
depends_on | depends_on: - db | 服务依赖关系(确保启动顺序) |
environment | environment: MYSQL_PASS=secret | 环境变量设置 |
command | command: ["python", "app.py"] | 覆盖容器默认启动命令 |
(三)高级配置参数
1. 资源限制
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: '0.5' # 限制0.5个CPU核心
memory: 128M # 限制128MB内存
reservations:
cpus: '0.25' # 至少保留0.25个CPU
memory: 64M # 至少保留64MB内存
2. 健康检查
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s # 每30秒检查一次
timeout: 10s # 超时时间10秒
retries: 3 # 连续3次失败则标记为不健康
start_period: 40s # 启动40秒后开始检查
3. 部署策略
services:
redis:
image: redis:alpine
deploy:
mode: replicated # 复制模式
replicas: 3 # 3个副本
restart_policy:
condition: on-failure # 仅在失败时重启
delay: 5s # 重启延迟5秒
max_attempts: 3 # 最多尝试3次
五、生产环境最佳实践
(一)多环境配置
1. 项目结构
project/
├── docker-compose.yml # 基础配置
├── docker-compose.prod.yml # 生产环境配置
├── docker-compose.dev.yml # 开发环境配置
├── Dockerfile
└── ...
2. 启动指定环境
# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 启动开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
(二)日志管理
services:
app:
build: .
logging:
driver: syslog # 使用syslog日志驱动
options:
syslog-address: "tcp://192.168.1.100:514" # 日志服务器地址
tag: "app-service" # 日志标签
(三)安全配置
services:
db:
image: postgres:13
environment:
# 从文件读取敏感信息
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt # 本地密钥文件
六、常用命令与故障排查
(一)核心操作命令
命令 | 说明 |
docker-compose up | 启动所有服务(默认前台运行) |
docker-compose up -d | 后台启动服务 |
docker-compose down | 停止并删除服务容器 |
docker-compose ps | 查看运行中服务 |
docker-compose logs | 查看服务日志 |
docker-compose exec web bash | 进入web服务容器 |
docker-compose scale web=3 | 扩展web服务到3个实例 |
(二)常见问题排查
1. 服务启动失败
# 查看详细日志
docker-compose logs service_name
# 进入容器调试
docker-compose exec service_name bash
# 查看容器状态
docker-compose ps
2. 端口冲突
# 查看端口占用
sudo lsof -i :端口号
# 修改compose.yml中的端口映射
ports:
- "8081:80" # 更换宿主机端口
3. 依赖服务未就绪
# 在compose.yml中添加healthcheck
services:
web:
depends_on:
db:
condition: service_healthy # 等待db健康检查通过
db:
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
七、进阶应用:与 Docker Swarm 集成
(一)Swarm 模式部署
# 初始化Swarm集群
docker swarm init
# 部署Compose应用(自动扩展为集群服务)
docker-compose -f docker-compose.yml -f docker-compose.swarm.yml up -d --scale web=5
(二)swarm.yml 配置示例
version: '3.7'
services:
web:
deploy:
mode: replicated
replicas: 5
labels:
- "com.example.service=web"
update_config:
parallelism: 2 # 每次更新2个容器
delay: 10s # 更新间隔10秒
restart_policy:
condition: on-failure
通过 Docker Compose,开发者能够以声明式方式定义复杂的多容器应用架构,大幅提升微服务部署效率。在实际项目中,建议结合 CI/CD 流程实现自动化构建与部署,同时利用 Compose 的配置分层特性(基础配置 + 环境配置)确保不同环境的一致性与隔离性。对于生产级别的大规模部署,可进一步与 Kubernetes 集成,实现更强大的集群管理与服务发现能力。