目录
[3.1 version - 版本声明](#3.1 version - 版本声明)
[3.2 services - 服务定义](#3.2 services - 服务定义)
[3.3 networks - 网络配置](#3.3 networks - 网络配置)
[3.4 volumes - 数据卷配置](#3.4 volumes - 数据卷配置)
[4、实战示例:搭建 WordPress](#4、实战示例:搭建 WordPress)
1、概念
一个 Docker Compose 文件(通常是 docker-compose.yml)是一个 YAML 格式的配置文件。它的核心作用是用一份配置文件,定义一个多容器的应用,包括各个服务、它们之间的网络、数据卷等资源。之后,只需要一个简单的 docker-compose up 命令,就能启动整个应用栈。
2、文件结构
一个典型的 Docker Compose 文件包含以下几个主要部分:
| 部分 | 功能说明 |
|---|---|
version |
定义 Compose 文件格式的版本。 |
services |
核心部分,定义应用中的各个服务容器。 |
networks |
定义服务之间通信所使用的网络。 |
volumes |
定义服务中需要使用的持久化数据卷。 |
3、核心配置项
3.1 version - 版本声明
这行代码通常位于文件首行,用于指定 Compose 文件格式的版本,它与 Docker Engine 的版本有对应关系。建议使用较新的版本(如 '3.8')以获得更多功能。
bash
version: '3.8'
3.2 services - 服务定义
这是文件中最关键的部分,每个服务都对应一个容器。
| 配置项 | 作用与示例 |
|---|---|
image |
指定服务所使用的镜像。 image: nginx:latest |
build |
如果服务需要从 Dockerfile 构建镜像(自定义镜像),则指定构建上下文路径。 build: ./app 或 详细配置: build: context: . dockerfile: Dockerfile.dev |
ports |
映射宿主机端口与容器端口。 ports: - "8080:80" - "443:443" |
volumes |
挂载宿主机目录或数据卷到容器中,用于数据持久化 或配置文件映射。 volumes: - ./html:/usr/share/nginx/html - db_data:/var/lib/mysql |
environment |
直接设置容器内的环境变量。 environment: - MYSQL_ROOT_PASSWORD=my-secret-pw - MYSQL_DATABASE=myapp |
env_file |
从一个文件中加载环境变量。 env_file: - ./.env |
depends_on |
表达服务之间的启动依赖关系 。Docker Compose 会先启动依赖的服务。 depends_on: - db - redis |
command |
覆盖容器启动后默认执行的命令。 command: ["nginx", "-g", "daemon off;"] |
restart |
配置容器的重启策略 ,例如 always 表示总是重启。 restart: always |
3.3 networks - 网络配置
可以定义自定义网络,以实现服务间更安全、更高效的通信。
bash
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql
networks:
- frontend
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
在这个例子中,web 和 db 服务通过 frontend 网络相连,而 db 还单独连接了 backend 网络。
3.4 volumes - 数据卷配置
数据卷用于持久化容器产生的数据,防止数据因容器删除而丢失。
bash
services:
db:
image: mysql
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
driver: local
这里定义了一个名为 db_data 的命名卷,并挂载到了 MySQL 容器的数据目录。
4、实战示例:搭建 WordPress
下面是一个经典的 WordPress 项目的 Docker Compose 文件,它清晰地展示了上述配置项是如何协同工作的。
bash
version: '3.9'
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
volumes:
- wordpress_data:/var/www/html
ports:
- "8888:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
这个例子是如何工作的:
-
服务 :定义了
db(数据库)和wordpress(网站)两个服务。 -
依赖 :
wordpress服务通过depends_on指明它依赖于db服务,因此数据库会先启动。 -
持久化 :通过命名卷
db_data和wordpress_data分别保存数据库数据和网站文件。 -
环境变量:通过环境变量配置数据库连接信息,例如密码、数据库名等。
-
端口映射 :将主机的
8888端口映射到wordpress容器的80端口,这样就能通过http://localhost:8888访问网站了。
5、常用操作命令
在包含 docker-compose.yml 文件的目录下,执行以下命令:
| 命令 | 说明 |
|---|---|
docker-compose up -d |
创建并启动所有服务(后台模式)。 |
docker-compose down |
停止并移除所有容器、网络。 |
docker-compose ps |
查看当前服务的状态。 |
docker-compose logs |
查看所有服务的日志输出。 |
docker-compose restart |
重启所有服务。 |