当前位置: 首页 > news >正文

学以致用——用Docker搭建ThinkPHP开发环境

在前几篇文档中,我们已经系统学习了 Docker 的核心概念(如容器、镜像、Docker 引擎等),并通过hello-world容器完成了第一次实战操作。当基础认知与入门实践相结合后,接下来我们可以尝试更贴近实际开发的场景 —— 利用 Docker 搭建 ThinkPHP 8.1 开发环境。

一、核心准备工作​

(一)验证 Docker 环境​

确保 Docker 已正确安装并运行,在 PowerShell 或命令提示符(CMD) 中执行以下命令验证:​

docker --version  # 查看Docker版本
docker-compose --version  # 查看Docker Compose版本

若如下图返回版本信息,说明环境就绪。​

二、搭建步骤详解​

(一)创建项目目录及 ThinkPHP 8.1 项目​

首先创建项目根目录并在其中生成 ThinkPHP 8.1 项目,步骤如下:​

1、创建项目根目录:​

在 Windows 中选择一个目录(如 E:\docker_dev\thinkphp-docker),作为项目根目录。​

2、创建 ThinkPHP 8.1 项目
方式一:通过 Docker Composer 镜像直接创建(无需进入容器):​
docker run --rm -v "${PWD}:/app" composer create-project topthink/think:8.1.* myweb​
​
# 若使用CMD,将${PWD}替换为%cd%​
# docker run --rm -v "%cd%:/app" composer create-project topthink/think:8.1.* myweb

命令解析:--rm表示容器运行后自动删除;-v "${PWD}:/app"(PowerShell)或-v "%cd%:/app"(CMD)将当前目录挂载到容器的/app目录;composer是官方镜像,直接创建项目到myweb目录。 

方式二:本地创建(需本地安装 Composer):​
composer create-project topthink/think:8.1.* myweb
方式三:容器内创建(无需本地安装 Composer):​
# 临时启动PHP容器并进入(PowerShell命令)
docker run --rm -it -v "${PWD}:/app" php:8.1-fpm /bin/bash# 若使用CMD,将${PWD}替换为%cd%
# docker run --rm -it -v "%cd%:/app" php:8.1-fpm /bin/bash# 在容器内安装Composer
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# 进入挂载目录并创建项目
cd /app && composer create-project topthink/think:8.1.* myweb# 退出容器
exit

此时项目目录结构已自动生成:​

thinkphp-docker/

└── myweb/ # 已创建的ThinkPHP 8.1项目代码目录

(二)编写 Docker Compose 配置​

在项目根目录(thinkphp-docker)创建docker-compose.yml,内容如下(Windows 环境无需修改路径格式,Docker 会自动适配):​

version: '3'
services:php:image: php:8.1-fpmvolumes:- ./myweb:/var/www/html  # 挂载本地项目到容器depends_on:- mysql  # 依赖mysql服务,确保先启动数据库nginx:image: nginx:latestports:- "80:80"  # 端口映射:宿主机80端口→容器80端口volumes:- ./myweb:/var/www/html  # 共享项目目录- ./nginx.conf:/etc/nginx/conf.d/thinkphp.conf  # 挂载Nginx配置depends_on:- php  # 依赖php服务mysql:image: mysql:8.0ports:- "3306:3306"  # 映射数据库端口environment:MYSQL_ROOT_PASSWORD: root  # 数据库root密码MYSQL_DATABASE: thinkphp  # 自动创建的数据库名MYSQL_CHARACTER_SET_SERVER: utf8mb4MYSQL_COLLATION_SERVER: utf8mb4_unicode_civolumes:- mysql_data:/var/lib/mysql  # 数据卷持久化存储数据volumes:mysql_data:  # 定义数据卷,防止容器删除丢失数据

关键配置解释:​

  • Windows 中./myweb等路径会被 Docker 自动转换为容器可识别的格式,无需手动修改为\​
  • mysql_data数据卷:在 Windows 上同样能确保数据持久化,不受容器删除影响​

(三)配置 Nginx 服务​

在项目根目录(thinkphp-docker)创建nginx.conf,内容如下:​

server {listen 80;server_name localhost;root /var/www/html/public;  # ThinkPHP 8.1入口目录(必须指向public)index index.php index.html;# URL重写支持(ThinkPHP的PATH_INFO模式)location / {if (!-e $request_filename) {rewrite  ^(.*)$  /index.php?s=$1  last;}}# PHP脚本解析location ~ \.php$ {fastcgi_pass php:9000;  # 连接php容器的9000端口fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}

此时项目完整目录结构为:​

thinkphp-docker/​

├── docker-compose.yml # 容器编排配置​

├── nginx.conf # Nginx站点配置​

└── myweb/ # ThinkPHP 8.1项目代码目录​

(四)启动容器集群​

在项目根目录执行以下命令启动所有服务:​

docker-compose up -d # -d参数表示后台运行​

执行该命令时,Docker 会自动检查本地是否存在所需镜像,若不存在则自动从 Docker Hub 拉取,只需等待拉取完成即可。​

如果本地不存在所需的镜像就需要多等待一会,具体如下图:

 成功后的页面:

查看容器状态:​

docker-compose ps # 显示所有服务的运行状态​
  • 状态为Up表示启动成功​
  • 若出现Exit状态,可通过docker-compose logs [服务名]查看错误日志​

(五)安装 PHP 必要扩展​

ThinkPHP 8.1 运行依赖pdo_mysql、mbstring等扩展,需进入 PHP 容器安装(Windows 终端操作):​

# 查看PHP容器名称(PowerShell/CMD通用)
docker ps --format "{{.Names}}" | findstr "php"# 示例输出:thinkphp-docker_php_1# 进入php容器(替换[容器名]为实际名称)
docker exec -it [容器名] /bin/bash# 若提示bash: not found,改用sh
# docker exec -it [容器名] /bin/sh# 安装扩展
docker-php-ext-install pdo_mysql mbstring# 退出容器
exit# 重启php容器使扩展生效
docker restart [容器名]

(六)环境测试与配置调整​

1、在浏览器访问http://localhost,出现 ThinkPHP 8.1 欢迎页即表示环境搭建成功​(我是修改过端口号的,所以我的地址是http://localhost:8080)

2、修改数据库配置(myweb/config/database.php):​

return ['type'     => 'mysql','hostname' => 'mysql',  # 数据库主机名填容器名'database' => 'thinkphp','username' => 'root','password' => 'root','hostport' => '3306','charset'  => 'utf8mb4',  # 与MySQL字符集保持一致
];

​数据库主机名使用mysql(容器名),利用 Docker 内部网络通信​

数据库主机名docker-compose.yml 的 services 下给 MySQL 服务起的名字

三、Windows 环境注意事项​

1、路径与终端差异:​

  • PowerShell 中使用${PWD}表示当前目录,CMD 中使用%cd%​
  • 避免在路径中使用中文或空格,可能导致挂载失败​
  • 推荐使用 PowerShell(管理员模式)执行命令,兼容性更好​

2、端口冲突:​

ports:

- "8080:80" # 宿主机8080端口映射到容器80端口

若 80 或 3306 端口被占用(如 IIS、其他数据库),需修改docker-compose.yml中的端口映射,例如:​

3、权限问题:​

  • Windows 系统无需执行chmod命令,文件权限由系统自动管理​
  • 若出现权限错误,右键项目目录→“属性”→“安全”,确保当前用户有读写权限​

通过以上适配 Windows 系统的步骤,可快速搭建标准化的 ThinkPHP 8.1 开发环境,有效解决多环境一致性问题。熟练掌握后,可根据实际需求扩展更多服务。​

参考文章:

Docker 初学者需要了解的几个知识点 (五):建容器需要进一步了解的概念(1)-CSDN博客

Docker 初学者需要了解的几个知识点 (六):docker-compose.yml (ThinkPHP)-CSDN博客

Docker 初学者需要了解的几个知识点 (七):php.ini -CSDN博客

http://www.xdnf.cn/news/1218583.html

相关文章:

  • 深入探索Weaviate:构建高效AI应用的数据库解决方案
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • 大模型流式长链接场景下 k8s 优雅退出 JAVA
  • PHP 与 MySQL 详解实战入门(1)
  • 零基础构建MCP服务器:TypeScript/Python双语言实战指南
  • 在幸狐RV1106板子上用gcc14.2本地编译安装samba-4.22.3服务器,并且支持XP系统访问共享文件夹
  • 基于单片机胎压检测/锅炉蒸汽压力/气压检测系统
  • LCM中间件入门(2):LCM核心实现原理解析
  • InfluxDB 与 Python 框架结合:Django 应用案例(二)
  • kmp复习,需要多看多练
  • Kubernetes 应用部署实战:为什么需要 Kubernetes?
  • InfluxDB 与 Python 框架结合:Django 应用案例(三)
  • Java Matcher对象中find()与matches()的区别
  • QT6 Python UI文件转换PY文件的方法
  • HttpServletRequest 和 HttpServletResponse核心接口区别
  • 哈希的概念及其应用
  • linux线程封装和互斥
  • Flutter Chen Generator - yaml配置使用
  • 了解SQL
  • 从姑苏区人工智能大模型基础设施招标|学习服务器、AI处理器、GPU
  • 【车联网kafka】Kafka核心架构与实战经验(第二篇)
  • 防火墙安全实验
  • 《秋招在即!Redis数据类型面试题解析》
  • Vue3+Vite项目如何简单使用tsx
  • SpringBoot+SpringAI打造智能对话机器人
  • MySQL 8.0 OCP 1Z0-908 题目解析(38)
  • Kafka Streams窗口技术全解析:从理论到电商实时分析实战
  • TTS语音合成|GPT-SoVITS语音合成服务器部署,实现http访问
  • Linux多线程线程控制
  • 前端核心技术Node.js(五)——Mongodb、Mongoose和接口