# Docker Compose 使用教程
Docker Compose 是 Docker 官方提供的用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件,您可以配置应用程序需要的所有服务,并使用单个命令创建和启动所有服务。本教程将详细介绍 Docker Compose 的使用方法。
1. 安装 Docker Compose
在开始之前,请确保您已经安装了 Docker。然后根据您的操作系统安装 Docker Compose:
# Linux 系统
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
# macOS (使用 Homebrew)
brew install docker-compose
# Windows (从官网下载安装包)
# https://docs.docker.com/compose/install/
2. 基本概念
Docker Compose 使用 YAML 文件 (默认为 `docker-compose.yml`) 来定义服务、网络和卷。核心概念包括:
- **服务 (Service)**:一个服务就是一个应用容器,例如 web 服务、数据库服务等
- **项目 (Project)**:由一组关联的服务组成的完整应用单元
- **网络 (Network)**:用于容器之间通信的网络
- **卷 (Volume)**:持久化存储数据
3. 编写 docker-compose.yml 文件
这是 Docker Compose 的核心文件,用于定义应用程序的服务、网络和卷。以下是一个基本示例:
version: '3.8' # 使用版本3.8
services:
web:
image: nginx:latest # 使用nginx最新镜像
ports:
- "8080:80" # 将主机8080端口映射到容器80端口
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
- ./html:/usr/share/nginx/html # 挂载静态文件
networks:
- app-network # 连接到app-network网络
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example # 设置root密码
volumes:
- db-data:/var/lib/mysql # 挂载数据卷
networks:
- app-network
volumes:
db-data: # 定义命名卷
networks:
app-network: # 定义网络
driver: bridge
4. Docker Compose 常用命令
在包含 `docker-compose.yml` 的目录中,可以使用以下命令:
启动服务
# 在前台启动服务(显示日志)
docker-compose up
# 在后台启动服务(-d 表示 detached)
docker-compose up -d
# 启动特定服务
docker-compose up web
停止服务
# 停止所有服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
# 停止特定服务
docker-compose stop web
查看服务状态
# 查看所有服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 实时查看日志(-f 表示 follow)
docker-compose logs -f web
其他常用命令
# 重新构建服务
docker-compose build
# 启动已停止的服务
docker-compose start
# 重启服务
docker-compose restart
# 在服务中执行命令
docker-compose exec web bash
# 查看配置
docker-compose config
5. 高级配置示例
以下是一个更复杂的示例,包含环境变量、依赖服务和健康检查:
version: '3.8'
services:
app:
build: . # 构建镜像
dockerfile: Dockerfile
environment:
DATABASE_URL: mysql://root:example@db:3306/mydb
depends_on:
db:
condition: service_healthy # 等待db服务健康检查通过
ports:
- "5000:5000"
networks:
- app-network
volumes:
- .:/app # 挂载当前目录到容器/app
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
interval: 5s
volumes:
db-data:
networks:
app-network:
6. 环境变量和覆盖文件
Docker Compose 支持使用环境变量和覆盖文件:
使用 .env 文件
创建 `.env` 文件:
MYSQL_PASSWORD=secret
然后在 `docker-compose.yml` 中使用:
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
使用覆盖文件
创建 `docker-compose.override.yml`(开发环境专用):
version: '3.8'
services:
app:
volumes:
- .:/app
environment:
- DEBUG=1
运行时 Compose 会自动合并两个文件:
docker-compose up
7. 实例:部署 WordPress
这是一个使用 Docker Compose 部署 WordPress 和 MySQL 的完整示例:
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
networks:
- app-network
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db:/var/lib/mysql
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
wordpress:
db:
networks:
app-network:
启动这个应用:
docker-compose up -d
现在您可以通过浏览器访问 `http://localhost:8080` 来配置 WordPress。
8. 生产环境最佳实践
在生产环境中使用 Docker Compose 时,建议:
1. 使用多个 Compose 文件(docker-compose.yml + docker-compose.prod.yml)
2. 不要在 Compose 文件中硬编码密码,使用环境变量
3. 为容器设置资源限制:
```python
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
```
4. 使用外部卷和网络:
```python
volumes:
db-data:
external: true
```
5. 定期备份重要数据
总结
Docker Compose 是一个强大的多容器管理工具,通过一个简单的 YAML 文件即可定义复杂的分布式应用。本教程涵盖了从安装、基本概念、编写配置文件到高级配置和实际应用部署的完整流程。掌握 Docker Compose 可以显著简化多容器应用的开发、测试和部署流程,提高工作效率。对于更复杂的容器编排需求,可以进一步学习 Kubernetes,但 Docker Compose 仍然是许多场景下的理想选择,尤其是在开发和中小规模部署环境中。





