Docker 初学者需要了解的几个知识点 (六):docker-compose.yml (ThinkPHP)
下面这个文 docker-compose.yml
文件定义了一个包含 PHP、Nginx、MySQL、Redis 的完整 ThinkPHP 开发环境,各配置项的含义如下:
version: '3.8'services:# PHP-FPM 服务php-fpm:image: php:8.1-fpmvolumes:- ./tp-demo:/var/www/html- ./php.ini:/usr/local/etc/php/php.ininetworks:- app-network# Nginx 服务nginx:image: nginx:alpineports:- "80:80"volumes:- ./tp-demo:/var/www/html- ./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- php-fpmnetworks:- app-network# MySQL 服务mysql:image: mysql:5.7ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=thinkphp_db- MYSQL_USER=thinkphp_user- MYSQL_PASSWORD=thinkphp_pwdvolumes:- ./mysql_data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:- app-network# Redis 服务(可选)redis:image: redis:alpineports:- "6379:6379"networks:- app-networknetworks:app-network:driver: bridgevolumes:mysql_data:
1. 版本声明
version: '3.8'
- 指定 Docker Compose 文件的版本(
3.8
是较新的稳定版本),不同版本支持的语法和特性不同,这里使用 3.8 以支持大部分现代功能。
2. 服务定义(services
)
这是核心部分,定义了需要启动的所有容器服务(PHP、Nginx、MySQL 等)。
2.1 PHP-FPM 服务(php-fpm
)
php-fpm:image: php:8.1-fpmvolumes:- ./tp-demo:/var/www/html- ./php.ini:/usr/local/etc/php/php.ininetworks:- app-network
php-fpm
: 服务名称(自定义,用于内部识别,如 Nginx 可通过此名称访问 PHP 服务)。image: php:8.1-fpm
: 使用官方 PHP 8.1 版本的 FPM 镜像(FPM 是 PHP 的 FastCGI 进程管理器,适合与 Nginx 配合)。volumes
: 目录映射(主机目录:容器内目录):./tp-demo:/var/www/html
: 将主机当前目录下的tp-demo
文件夹(ThinkPHP 项目代码)映射到容器内的/var/www/html
(PHP 服务的工作目录),实现 “主机修改代码,容器内实时生效”。./php.ini:/usr/local/etc/php/php.ini
: 将主机的php.ini
配置文件映射到容器的 PHP 配置目录,用于自定义 PHP 配置(如启用扩展、设置时区等)。
networks: - app-network
: 让该服务加入app-network
网络,以便与其他服务(如 MySQL、Nginx)通信。
2.2 Nginx 服务(nginx
)
nginx:image: nginx:alpineports:- "80:80"volumes:- ./tp-demo:/var/www/html- ./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- php-fpmnetworks:- app-network
nginx
: 服务名称。image: nginx:alpine
: 使用轻量级的 Nginx 镜像(alpine
版本体积更小)。ports: - "80:80"
: 端口映射(主机端口:容器端口),将主机的 80 端口映射到容器的 80 端口,这样可以通过http://localhost
访问 Nginx 服务。volumes
:./tp-demo:/var/www/html
: 与 PHP 服务共享同一个项目目录(确保 Nginx 能访问到 ThinkPHP 的public
目录,这是 ThinkPHP 的入口目录)。./nginx.conf:/etc/nginx/conf.d/default.conf
: 将主机的nginx.conf
配置文件映射到容器的 Nginx 默认配置,用于定义 ThinkPHP 的路由规则(如 URL 重写)。
depends_on: - php-fpm
: 声明依赖关系,Nginx 会在php-fpm
服务启动后再启动(避免 Nginx 先启动却找不到 PHP 服务的问题)。networks: - app-network
: 加入app-network
网络,可通过php-fpm
服务名访问 PHP 服务(如 Nginx 配置中fastcgi_pass php-fpm:9000
)。
2.3 MySQL 服务(mysql
)
mysql:image: mysql:5.7ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=thinkphp_db- MYSQL_USER=thinkphp_user- MYSQL_PASSWORD=thinkphp_pwdvolumes:- ./mysql_data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:- app-network
mysql
: 服务名称。image: mysql:5.7
: 使用 MySQL 5.7 版本镜像(ThinkPHP 对 MySQL 5.7 兼容性较好)。ports: - "3306:3306"
: 端口映射,主机的 3306 端口映射到容器的 3306 端口,方便用 Navicat 等工具连接容器内的 MySQL。environment
: 环境变量(初始化 MySQL 配置):MYSQL_ROOT_PASSWORD=root
: 根用户(root)的密码。MYSQL_DATABASE=thinkphp_db
: 自动创建名为thinkphp_db
的数据库(ThinkPHP 项目可直接使用)。MYSQL_USER=thinkphp_user
和MYSQL_PASSWORD=thinkphp_pwd
: 自动创建一个普通用户(用于 ThinkPHP 连接数据库,避免直接使用 root 权限)。
volumes
:./mysql_data:/var/lib/mysql
: 将 MySQL 数据目录(容器内/var/lib/mysql
)映射到主机mysql_data
文件夹,实现数据持久化(即使删除容器,数据库数据也不会丢失)。./init.sql:/docker-entrypoint-initdb.d/init.sql
: 将初始化 SQL 脚本(init.sql
)映射到容器的初始化目录,MySQL 启动时会自动执行该脚本(如创建表、插入测试数据)。
networks: - app-network
: 加入app-network
网络,ThinkPHP 项目(PHP 服务)可通过mysql
服务名连接数据库(如配置中hostname => 'mysql'
)。
2.4 Redis 服务(redis
,可选)
redis:image: redis:alpineports:- "6379:6379"networks:- app-network
redis
: 服务名称(可选,用于 ThinkPHP 的缓存、会话存储等)。image: redis:alpine
: 轻量级 Redis 镜像。ports: - "6379:6379"
: 端口映射,主机可通过 6379 端口访问 Redis。networks: - app-network
: 加入网络,PHP 服务可通过redis
服务名连接(如 ThinkPHP 缓存配置中host => 'redis'
)。
3. 网络定义(networks
)
networks:app-network:driver: bridge
- 定义一个名为
app-network
的网络,驱动为bridge
(Docker 默认的桥接网络模式)。 - 所有服务(php-fpm、nginx、mysql、redis)都加入这个网络后,可通过 服务名 互相访问(无需记 IP 地址),例如:
- Nginx 访问 PHP:
php-fpm:9000
- PHP 访问 MySQL:
mysql:3306
- PHP 访问 Redis:
redis:6379
- Nginx 访问 PHP:
4. 数据卷定义(volumes
)
volumes:mysql_data:
- 声明一个名为
mysql_data
的数据卷(由 Docker 管理的持久化存储)。 - 虽然在
mysql
服务的volumes
中已经映射了./mysql_data:/var/lib/mysql
,但这里显式声明后,Docker 会更规范地管理该目录(避免权限问题)。
总结
这个配置通过 Docker Compose 一键启动了 ThinkPHP 开发所需的所有服务:
- Nginx 处理 HTTP 请求并转发给 PHP-FPM
- PHP-FPM 运行 ThinkPHP 代码
- MySQL 提供数据库服务
- Redis 提供缓存服务(可选)
- 所有服务通过统一网络通信,数据通过卷映射持久化到主机,确保开发时 “修改即生效” 且数据不丢失。