5.2 Docker Compose 文件结构
Docker Compose 的核心是 docker-compose.yml 文件,它采用 YAML 格式定义服务、网络和卷。一个基本的 Compose 文件包含以下部分:
- version:指定 Compose 文件格式版本,例如
'3.8'。 - services:定义各个容器服务,每个服务对应一个容器。
- networks:配置自定义网络。
- volumes:声明数据卷。
YAML 文件使用缩进来表示层级关系,冒号表示键值对,连字符表示列表项。
以下是一个典型的 docker-compose.yml 示例,定义了一个 WordPress 的应用配置。
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
networks:
- backend
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
depends_on:
- db
networks:
- frontend
- backend
networks:
frontend:
backend:
volumes:
db_data:这个 WordPress 的应用配置示例中展示了:
- 两个服务:MySQL 数据库和 WordPress。
- 自定义网络:frontend 和 backend。
- 声明数据卷:数据卷 db_data 持久化数据库。
- 设置环境变量:设置 MySQL 数据库和 WordPress 相关环境变量。
- 端口映射:将容器 80 端口映射到主机 80 端口。
- 服务依赖关系:确保数据库服务先启动。
下面详细说明每个部分的作用和配置方法。
version:指定使用的 Compose 文件格式版本。不同版本支持的功能不同。目前常用的是 3.x 版本。版本号需要用引号包裹。
示例:
version: '3.8'版本号影响可用功能。例如 3.8 版本支持更多配置选项。版本号必须与安装的 Docker Compose 版本兼容。如果不指定版本,默认使用最新支持版本。
services:定义需要运行的容器服务,是 Compose 文件的核心部分。每个服务对应一个容器。服务名称自定义,作为容器的标识。
基本服务配置示例:
services:
web:
image: nginx:latest
ports:
- "80:80"常用服务配置项:
image:指定使用的镜像名称和标签。可以从 Docker Hub 获取或使用本地构建的镜像。
build:如果使用本地 Dockerfile 构建镜像,需要指定构建路径。
yamlbuild: ./dirports:设置端口映射,格式为
"主机端口:容器端口"。yamlports: - "8080:80"volumes:配置数据卷挂载,支持主机路径和命名卷。
yamlvolumes: - /host/path:/container/path - named_volume:/container/pathenvironment:设置环境变量,可以用列表或键值对格式。
yamlenvironment: - VAR1=value1 - VAR2=value2depends_on:定义服务启动顺序,确保依赖服务先启动。
yamldepends_on: - dbrestart:设置容器重启策略,比如
always表示总是自动重启。yamlrestart: alwayscommand:覆盖容器启动命令。
yamlcommand: ["python", "app.py"]
完整服务示例:
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
depends_on:
- redis
redis:
image: redis:alpine
volumes:
- redis_data:/datanetworks:定义自定义网络。容器通过网络名称互相通信。默认会创建 bridge 网络。
示例:
networks:
frontend:
driver: bridge
backend:
driver: bridge服务中使用网络:
services:
web:
networks:
- frontend
db:
networks:
- backend自定义网络提供更好的隔离性。不同网络的容器默认不能互相访问。
volumes:声明数据卷。数据卷用于持久化存储和容器间共享数据。
示例:
volumes:
db_data:
driver: local
app_data:
driver: local服务中使用卷:
services:
db:
volumes:
- db_data:/var/lib/mysql卷数据独立于容器生命周期。删除容器不会删除卷数据。