卡飞资源网

专业编程技术资源共享平台

第十一节 Docker Compose 全面指南:从多容器部署到生产实践

一、Compose 核心概念与价值

(一)多容器管理痛点

在微服务架构中,单个应用通常由多个容器组成(如Web服务+数据库+缓存),手动管理存在以下问题:

  • 环境不一致:各容器启动顺序、依赖关系难以维护
  • 部署效率低:需逐个启动容器并配置网络映射
  • 配置复杂:端口映射、数据卷挂载需重复操作

(二)Compose 解决方案

Compose 是 Docker 官方提供的多容器编排工具,通过 YAML 文件定义应用的完整架构,实现:

  • 一键部署:通过 docker-compose up 启动所有服务
  • 依赖管理:自动处理服务间的启动顺序和网络连接
  • 环境标准化:通过配置文件确保开发、测试、生产环境一致

(三)Compose 工作流程

  1. 定义环境:使用 Dockerfile 构建服务镜像
  2. 配置服务:通过 docker-compose.yml 定义服务间关系
  3. 启动应用:执行 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 集成,实现更强大的集群管理与服务发现能力。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言