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

发布于:2025-08-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

在前几篇文档中,我们已经系统学习了 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-fpm
    volumes:
      - ./myweb:/var/www/html  # 挂载本地项目到容器
    depends_on:
      - mysql  # 依赖mysql服务,确保先启动数据库

  nginx:
    image: nginx:latest
    ports:
      - "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.0
    ports:
      - "3306:3306"  # 映射数据库端口
    environment:
      MYSQL_ROOT_PASSWORD: root  # 数据库root密码
      MYSQL_DATABASE: thinkphp  # 自动创建的数据库名
      MYSQL_CHARACTER_SET_SERVER: utf8mb4
      MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
    volumes:
      - 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博客


网站公告

今日签到

点亮在社区的每一天
去签到