Docker Compose 是简化多容器应用管理的利器,而核心在于其配置文件 docker-compose.yml
。通过这个文件,用户可以描述所有服务、网络和存储配置,以实现快速、可重复的部署。
本文将详细讲解 docker-compose.yml
文件的基本结构、常见配置项及其应用场景,并结合具体示例,帮助您全面掌握 Docker Compose 的配置和使用。
一、Docker Compose 文件概述
docker-compose.yml
是用 YAML 格式编写的文件,用于定义多容器应用的所有配置。通过这个文件,您可以:
- 定义应用的服务、镜像、环境变量、端口映射等;
- 指定容器间的依赖关系、网络拓扑和存储配置;
- 使用简单命令(如
docker-compose up
)一键启动整个应用。
配置文件的基本结构
一个典型的 docker-compose.yml
文件通常包含以下部分:
version
:指定 Compose 文件的版本。services
:定义应用中的服务。volumes
和networks
:定义数据存储和网络配置。
以下是一个基本的 Compose 文件示例:
version: "3.9" # Compose 文件的版本
services: # 定义服务
web: # 服务名称
image: nginx:latest # 使用的镜像
ports:
- "8080:80" # 端口映射
volumes:
- ./data:/usr/share/nginx/html # 数据挂载
networks:
- app-network # 连接到指定网络
db: # 数据库服务
image: mysql:5.7
environment: # 配置环境变量
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
volumes: # 定义存储卷
db-data:
networks: # 定义网络
app-network:
二、Compose 文件的核心配置项
2.1 version
:指定 Compose 文件版本
功能:确定 Compose 文件语法和功能支持的版本。
推荐版本:使用最新版本(如 3.9
),以获得最新功能。
示例:
version: "3.9"
常见版本说明:
2.x
系列:适用于旧版 Docker 引擎,支持较简单的功能。3.x
系列:针对生产环境优化,支持 Swarm 模式。
2.2 services
:定义服务
功能:指定应用中的各个服务及其配置。 配置项:
image
:使用的镜像。build
:从源码构建镜像。ports
:端口映射。volumes
:数据卷挂载。environment
:环境变量设置。depends_on
:定义服务依赖关系。
示例:
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
app:
build:
context: ./app # 构建镜像的上下文路径
environment:
APP_ENV: production
depends_on:
- db # 依赖数据库服务
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: appdb
2.3 volumes
:定义数据卷
功能:为容器提供持久化存储。 类型:
- 匿名卷:由 Docker 管理,生命周期与容器绑定。
- 命名卷:在
docker-compose.yml
中显式声明,独立于容器生命周期。 - 绑定挂载:直接挂载主机目录到容器内。
示例:
volumes:
db-data: # 命名卷
app-logs: # 持久化应用日志
services:
db:
image: mysql:5.7
volumes:
- db-data:/var/lib/mysql
app:
image: my-app:latest
volumes:
- ./logs:/app/logs # 绑定挂载
场景:持久化数据库数据
使用卷可以确保即使容器被销毁,数据库的数据仍然保留。
2.4 networks
:定义网络
功能:配置服务间的网络通信。
网络模式:
- 桥接网络(默认):服务间可通信,外部访问需端口映射。
- 主机网络:与主机共享网络栈。
- 无网络:隔离容器网络。
示例:
networks:
app-network:
services:
web:
image: nginx
networks:
- app-network
db:
image: mysql
networks:
- app-network
场景:服务间通信
通过网络配置,可让 Web 服务与数据库服务互相访问。
三、完整示例与实践
3.1 多容器 Web 应用示例
需求描述:
部署一个简单的 Web 应用,包含:
- Nginx 作为前端;
- Flask 应用服务;
- MySQL 数据库服务。
docker-compose.yml
:
version: "3.9"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- app-network
app:
build:
context: ./app
environment:
DATABASE_URL: mysql://root:example@db/mydb
networks:
- app-network
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
volumes:
db-data:
networks:
app-network:
启动应用:
docker-compose up --build
结果:
- Nginx 在
http://localhost:8080
提供服务。 - Flask 应用通过 Nginx 反向代理与数据库通信。
3.2 使用多个环境文件
配置开发和生产环境:
docker-compose.override.yml
:开发环境特定配置。docker-compose.prod.yml
:生产环境特定配置。
示例:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
四、优化与注意事项
- 配置分离:开发、测试和生产环境使用不同的 Compose 文件。
- 健康检查:确保服务按预期启动。
- 合理使用卷:避免绑定挂载对主机文件系统的破坏性影响。
- 日志管理:结合日志驱动记录服务日志。
五、总结
通过 docker-compose.yml
文件,您可以轻松定义和管理多容器应用的所有配置。本篇文章介绍了 Compose 文件的基本结构及配置项,并通过完整示例展示了其实际应用。
使用 Docker Compose,您可以:
- 简化多服务应用的配置与管理;
- 提高开发和生产环境的一致性;
- 加速应用的部署与迭代。
从基本结构到高级用法,docker-compose.yml
是构建容器化应用不可或缺的工具。