Docker Compose

Docker Compose

使用Docker Compose定义和运行多容器Docker应用程序,简化容器编排和管理。

多容器 编排 YAML配置 服务依赖

什么是 Docker Compose?

Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件配置应用服务,然后使用单个命令创建并启动所有服务。

使用Compose基本上是一个三步过程:

  1. 使用Dockerfile定义应用环境
  2. 使用docker-compose.yml定义服务
  3. 运行docker compose up启动应用
Compose 的优势
  • 快速搭建开发环境
  • 简化多服务应用部署
  • 服务依赖管理
  • 环境配置版本控制
  • 跨环境一致性

安装 Docker Compose

Docker Compose已经包含在Docker Desktop for Windows和Mac中。对于Linux系统,需要单独安装。

Linux 安装

# 下载最新版本的Docker Compose
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 Compose V2开始,命令从docker-compose改为docker compose(作为Docker CLI插件)。

大多数现代Docker安装已经包含了Compose V2。

验证安装

# 检查Compose版本
docker compose version

# 或者使用旧版本命令
docker-compose --version
                        

Compose 文件结构

典型的Compose项目结构

my-app/
  docker-compose.yml
  web/
    Dockerfile
    app.py
    requirements.txt
  db/
    init.sql
  nginx/
    nginx.conf
docker-compose.yml 文件位置

Compose文件通常命名为docker-compose.ymldocker-compose.yaml,放置在项目根目录。

文件命名

虽然.yml.yaml都可以使用,但建议使用.yml以获得更好的兼容性。

Compose 文件语法详解

基本结构


version: '3.8'  # Compose文件版本

services:       # 定义服务
web:          # 服务名称
build: .    # 构建配置
ports:
  - "5000:5000"

database:     # 另一个服务
image: postgres:13
environment:
  POSTGRES_PASSWORD: example

networks:       # 定义网络
app-network:
driver: bridge

volumes:        # 定义数据卷
db-data:

常用配置指令

build - 构建镜像

services:
webapp:
build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1
image - 使用现有镜像

services:
database:
image: postgres:13
environment:
  POSTGRES_PASSWORD: mysecretpassword
ports - 端口映射

services:
web:
ports:
  - "80:80"           # host:container
  - "443:443"
  - "8080:80"         # 映射到不同主机端口
environment - 环境变量

services:
app:
environment:
  - NODE_ENV=production
  - DATABASE_URL=postgres://user:pass@db:5432/mydb
env_file:
  - .env
  - .env.local
volumes - 数据卷

services:
database:
volumes:
  - db-data:/var/lib/postgresql/data  # 命名卷
  - ./data:/app/data                  # 绑定挂载
  - /etc/localtime:/etc/localtime:ro  # 只读挂载

volumes:
db-data:
networks - 网络配置

services:
web:
networks:
  - frontend
  - backend

api:
networks:
  - backend

networks:
frontend:
driver: bridge
backend:
driver: bridge
depends_on - 服务依赖

services:
web:
depends_on:
  - database
  - redis

database:
image: postgres:13

redis:
image: redis:6-alpine

完整的 Compose 文件示例

Web应用 + 数据库 + Redis

version: '3.8'

services:
# Web应用服务
web:
build: .
ports:
  - "8000:8000"
environment:
  - DATABASE_URL=postgres://user:password@db:5432/myapp
  - REDIS_URL=redis://redis:6379
depends_on:
  - db
  - redis
volumes:
  - .:/app
networks:
  - app-network

# 数据库服务
db:
image: postgres:13
environment:
  POSTGRES_DB: myapp
  POSTGRES_USER: user
  POSTGRES_PASSWORD: password
volumes:
  - postgres-data:/var/lib/postgresql/data
networks:
  - app-network

# Redis服务
redis:
image: redis:6-alpine
command: redis-server --appendonly yes
volumes:
  - redis-data:/data
networks:
  - app-network

# Nginx反向代理
nginx:
image: nginx:alpine
ports:
  - "80:80"
volumes:
  - ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
  - web
networks:
  - app-network

volumes:
postgres-data:
redis-data:

networks:
app-network:
driver: bridge

Compose 常用命令

命令 描述 示例
docker compose up 创建并启动所有服务 docker compose up -d
docker compose down 停止并移除所有容器、网络 docker compose down -v
docker compose ps 查看运行中的服务状态 docker compose ps
docker compose logs 查看服务日志 docker compose logs -f web
docker compose build 构建或重新构建服务 docker compose build --no-cache
docker compose exec 在运行中的容器中执行命令 docker compose exec db psql -U user
docker compose restart 重启服务 docker compose restart web
docker compose config 验证并查看Compose文件 docker compose config
docker compose pull 拉取服务镜像 docker compose pull
docker compose top 显示运行的进程 docker compose top

Compose 工作流程

1
定义Dockerfile

为每个需要构建镜像的服务创建Dockerfile

2
创建docker-compose.yml

定义服务、网络、数据卷等配置

3
启动应用

运行docker compose up启动所有服务

4
管理应用

使用Compose命令管理应用生命周期

多环境配置

使用多个Compose文件

可以为不同环境(开发、测试、生产)创建多个Compose文件:

文件结构
docker-compose.yml
docker-compose.override.yml
docker-compose.prod.yml
基础配置 (docker-compose.yml)

version: '3.8'
services:
web:
build: .
environment:
  - DATABASE_URL=postgres://db:5432/app
depends_on:
  - db

db:
image: postgres:13
environment:
  POSTGRES_DB: app
开发环境覆盖 (docker-compose.override.yml)

version: '3.8'
services:
web:
ports:
  - "8000:8000"
volumes:
  - .:/app
environment:
  - DEBUG=true

db:
ports:
  - "5432:5432"
生产环境配置 (docker-compose.prod.yml)

version: '3.8'
services:
web:
ports:
  - "80:8000"
environment:
  - DEBUG=false

db:
volumes:
  - db-data:/var/lib/postgresql/data

volumes:
db-data:
使用多个文件

# 开发环境(默认使用docker-compose.yml和docker-compose.override.yml)
docker compose up

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

实际应用场景

开发环境

使用Compose快速搭建包含数据库、缓存、消息队列的完整开发环境。


version: '3.8'
services:
web:
build: .
ports: ["3000:3000"]
volumes: [".:/app"]
environment:
  - DB_HOST=db
  - REDIS_HOST=redis
depends_on: [db, redis]

db:
image: postgres:13
environment:
  POSTGRES_PASSWORD: devpass
ports: ["5432:5432"]

redis:
image: redis:alpine
ports: ["6379:6379"]
微服务架构

编排多个相互依赖的微服务。


version: '3.8'
services:
gateway:
build: ./gateway
ports: ["80:8080"]
depends_on: [users, orders, products]

users:
build: ./users-service
environment:
  - DB_URL=postgres://db:5432/users

orders:
build: ./orders-service
environment:
  - DB_URL=postgres://db:5432/orders

products:
build: ./products-service
environment:
  - DB_URL=postgres://db:5432/products

db:
image: postgres:13
environment:
  POSTGRES_MULTIPLE_DATABASES: users,orders,products
测试环境

为CI/CD流水线创建隔离的测试环境。


version: '3.8'
services:
tests:
build: .
command: pytest
depends_on:
  db:
    condition: service_healthy
environment:
  - TEST_DATABASE_URL=postgres://test:test@db:5432/test

db:
image: postgres:13
environment:
  POSTGRES_USER: test
  POSTGRES_PASSWORD: test
  POSTGRES_DB: test
healthcheck:
  test: ["CMD-SHELL", "pg_isready -U test"]
  interval: 5s
  timeout: 5s
  retries: 5

最佳实践

使用版本控制

docker-compose.yml文件纳入版本控制,确保团队所有成员使用相同的配置。

环境变量管理

使用.env文件管理敏感信息,避免在Compose文件中硬编码密码和密钥。


# .env 文件
DB_PASSWORD=mysecretpassword
API_KEY=abcdef123456
合理使用数据卷

为需要持久化的数据使用命名卷,开发环境可以使用绑定挂载方便代码热重载。

健康检查

为服务配置健康检查,确保服务依赖关系正确工作。


services:
web:
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
  interval: 30s
  timeout: 10s
  retries: 3
资源限制

为生产环境服务设置资源限制,防止单个服务消耗过多资源。


services:
web:
deploy:
  resources:
    limits:
      cpus: '0.50'
      memory: 512M
    reservations:
      cpus: '0.25'
      memory: 256M

常见问题与解决方案

问题描述: 服务启动时依赖的服务还没有准备好。

解决方案:

  • 使用depends_on定义服务依赖关系
  • 为服务添加健康检查
  • 在应用代码中添加重试逻辑
  • 使用condition: service_healthy

services:
web:
depends_on:
  db:
    condition: service_healthy

db:
healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres"]
  interval: 5s
  timeout: 5s
  retries: 5

问题描述: 启动服务时出现端口已被占用的错误。

解决方案:

  • 更改冲突的端口映射
  • 停止占用端口的其他服务
  • 使用不同的Compose项目名称
  • 检查宿主机端口使用情况

# 使用自定义项目名称避免冲突
docker compose -p myproject up

# 查看端口占用
netstat -tulpn | grep :80

问题描述: 在Compose文件中设置的环境变量没有生效。

解决方案:

  • 检查环境变量语法是否正确
  • 确认.env文件位置和格式
  • 重启服务使环境变量生效
  • 使用docker compose config验证配置

# 验证Compose配置
docker compose config

# 查看服务环境变量
docker compose exec web env
Compose掌握!

恭喜!您已经掌握了Docker Compose的核心知识。现在可以轻松定义和管理多容器应用程序,提高开发和部署效率。