?下面這個文?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 提供緩存服務(可選)
- 所有服務通過統一網絡通信,數據通過卷映射持久化到主機,確保開發時 “修改即生效” 且數據不丟失。