1. Docker Compose 是什么?
Docker Compose 是 Docker 官方推出的一个用于定义和运行多容器 Docker 应用程序的工具。它允许我们通过一个 YAML 文件来配置应用服务,然后使用一个简单的命令就能创建并启动所有服务。
在实际开发中,我们经常会遇到需要同时运行多个容器的情况。比如一个典型的 Web 应用可能需要:
- 前端容器
- 后端容器
- 数据库容器
- 缓存容器
- 消息队列容器
如果手动用 docker run 命令一个个启动这些容器,不仅效率低下,而且容易出错。Docker Compose 就是为了解决这个问题而生的。
提示:Docker Compose 特别适合开发环境和测试环境的部署,对于生产环境,建议使用 Kubernetes 等更专业的编排工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker Compose 的核心概念
2.1 服务 (Service)
在 Docker Compose 中,服务是指一个容器的定义。一个服务可以包含:
- 使用哪个镜像
- 暴露哪些端口
- 挂载哪些卷
- 依赖哪些其他服务
- 环境变量配置
- 资源限制等
2.2 项目 (Project)
项目是由一组关联的服务组成的完整应用。默认情况下,项目名称就是 docker-compose.yml 文件所在目录的名称,也可以通过 -p 参数指定。
2.3 docker-compose.yml 文件
这是 Docker Compose 的核心配置文件,采用 YAML 格式编写。一个典型的 docker-compose.yml 文件结构如下:
yaml复制version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
3. Docker Compose 的安装与使用
3.1 安装 Docker Compose
Docker Compose 的安装方式取决于你的操作系统:
Linux 系统安装
bash复制# 下载最新版本的 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
# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
Windows/macOS 安装
如果你使用的是 Docker Desktop,它已经内置了 Docker Compose,无需额外安装。
3.2 常用命令
Docker Compose 提供了一系列命令来管理多容器应用:
bash复制# 启动所有服务(后台运行)
docker-compose up -d
# 停止并移除所有容器
docker-compose down
# 查看运行状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 构建或重新构建服务
docker-compose build
# 启动已存在的服务
docker-compose start
# 停止运行中的服务
docker-compose stop
# 重启服务
docker-compose restart
# 删除停止的容器
docker-compose rm
4. Docker Compose 实战案例
4.1 WordPress 博客系统部署
下面是一个使用 Docker Compose 部署 WordPress 的完整示例:
yaml复制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:
- ./wp-content:/var/www/html/wp-content
volumes:
db_data:
这个配置会启动两个服务:
- MySQL 数据库服务
- WordPress 服务
启动命令:
bash复制docker-compose up -d
启动后,访问 http://localhost:8000 即可看到 WordPress 安装界面。
4.2 微服务架构示例
下面是一个更复杂的微服务架构示例,包含:
- API 网关
- 用户服务
- 订单服务
- Redis 缓存
- MySQL 数据库
yaml复制version: '3.8'
services:
gateway:
build: ./gateway
ports:
- "8080:8080"
depends_on:
- user-service
- order-service
user-service:
build: ./user-service
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
order-service:
build: ./order-service
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: microservices
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
mysql_data:
5. Docker Compose 高级特性
5.1 环境变量配置
Docker Compose 支持多种方式配置环境变量:
- 直接在 docker-compose.yml 中定义:
yaml复制services:
app:
environment:
- DATABASE_URL=postgres://user:pass@db:5432/db
- 使用环境变量文件:
yaml复制services:
app:
env_file:
- .env
- .env.dev
- 从宿主机环境变量继承:
yaml复制services:
app:
environment:
- DATABASE_URL
5.2 网络配置
Docker Compose 会自动为项目创建一个专用网络,服务之间可以通过服务名相互访问。你也可以自定义网络:
yaml复制networks:
frontend:
driver: bridge
backend:
driver: bridge
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
db:
networks:
- backend
5.3 健康检查
可以为服务配置健康检查,确保服务真正可用:
yaml复制services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
5.4 资源限制
可以限制容器使用的资源:
yaml复制services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
6. Docker Compose 最佳实践
6.1 项目结构组织
一个好的 Docker Compose 项目应该这样组织:
code复制myapp/
├── docker-compose.yml
├── .env
├── service1/
│ ├── Dockerfile
│ └── ...
├── service2/
│ ├── Dockerfile
│ └── ...
└── volumes/
├── db_data/
└── ...
6.2 多环境配置
可以使用多个 compose 文件来管理不同环境:
bash复制# 基础配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
docker-compose.prod.yml 可以覆盖或扩展基础配置:
yaml复制services:
web:
environment:
- DEBUG=false
deploy:
replicas: 3
6.3 常见问题解决
-
端口冲突:
- 检查端口是否被其他服务占用
- 使用
netstat -tulnp | grep <port>查找占用进程
-
容器启动顺序问题:
- 使用 depends_on 控制启动顺序
- 结合健康检查确保依赖服务真正可用
-
构建缓存问题:
- 使用
docker-compose build --no-cache忽略缓存 - 合理使用 .dockerignore 文件
- 使用
-
权限问题:
- 确保挂载的卷有正确权限
- 可以在 Dockerfile 中设置正确的用户和组
7. Docker Compose 与 CI/CD 集成
Docker Compose 可以很好地与 CI/CD 流程集成:
7.1 GitHub Actions 示例
yaml复制name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker
uses: docker/setup-buildx-action@v1
- name: Build and test
run: |
docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d
docker-compose run --rm web pytest
docker-compose down
7.2 GitLab CI 示例
yaml复制stages:
- test
- deploy
test:
stage: test
script:
- docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d
- docker-compose run --rm web pytest
- docker-compose down
deploy:
stage: deploy
script:
- docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
8. Docker Compose 的未来发展
Docker Compose 正在向更广泛的容器编排领域发展:
-
与 Kubernetes 集成:
- 可以使用
docker-compose convert命令将 compose 文件转换为 Kubernetes 资源 - Docker Desktop 内置了 Kubernetes 支持,可以一键部署 compose 项目到 k8s
- 可以使用
-
云服务集成:
- AWS ECS 和 Azure Container Instances 都支持直接部署 compose 文件
- 使用
docker context可以轻松切换不同的部署环境
-
新特性:
- 支持更多的部署选项和资源类型
- 改进的性能和稳定性
- 更好的开发者体验
在实际项目中,我通常会根据项目规模和复杂度选择不同的工具组合。对于中小型项目,Docker Compose 完全够用;对于大型分布式系统,可以考虑 Kubernetes 等更专业的编排工具。
