使用 php:8.5-fpm 镜像部署 thinkphp8 项目,核心做法是将 php-fpm 进程作为应用容器运行,并通过 nginx 容器进行反向代理。你需要编写一个包含 thinkphp8 入口文件、依赖包和 fpm 配置的 dockerfile,构建出镜像后,启动该容器并映射端口,同时确保 nginx 的配置文件正确指向该容器的内部端口(通常是 9000)。

如何编写支持 ThinkPHP8 的 Dockerfile?
直接回答:在 Dockerfile 中基于 php:8.5-fpm 安装必要的扩展(如 pdo_mysql、redis),将项目代码复制到工作目录,执行 composer install 安装依赖,并设置正确的权限。

Dockerfile
FROM php:8.5-fpm
# 安装系统依赖和 PHP 扩展
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd pdo_mysql redis opcache
# 设置工作目录
WORKDIR /var/www/html
# 复制项目代码
COPY . .
# 安装 Composer 依赖
RUN composer install --no-dev --optimize-autoloader
# 设置权限
RUN chown -R www-data:www-data /var/www/html
# 暴露端口(FPM 默认监听 9000,通常不直接暴露给宿主机,而是通过 Nginx 访问)
EXPOSE 9000上述代码首先拉取官方 php:8.5-fpm 镜像。接着,使用 apt-get 安装 GD 库所需的开发库,并通过 docker-php-ext-install 编译安装 gd、pdo_mysql、redis 和 opcache 扩展。然后,将当前目录下的所有文件复制到容器的 /var/www/html 目录。执行 composer install 以安装生产环境依赖。最后,将文件所有者更改为 www-data,这是 PHP-FPM 默认运行的用户,以确保写入权限正常。
立即学习“PHP免费学习笔记(深入)”;
Nginx 如何配置以代理 PHP-FPM?
直接回答:Nginx 配置文件中,需要将 .php 请求传递给 PHP-FPM 容器。通过 fastcgi_pass 指令指向 PHP-FPM 容器的服务名或 IP 地址及端口(如 php:9000),并包含标准的 fastcgi_params 文件。

server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}这段 Nginx 配置是 ThinkPHP8 的标准配置。关键点在于 root /var/www/html/public;,因为 ThinkPHP8 的入口文件位于 public/index.php。在 location / 块中,try_files 指令实现了 URL 重写,将所有非静态文件的请求重定向到 index.php,从而实现 ThinkPHP 的路由功能。在 location ~ \.php$ 块中,fastcgi_pass php:9000; 将 PHP 脚本的执行请求转发给名为 php 的容器(即运行 php:8.5-fpm 的容器)的 9000 端口。fastcgi_param SCRIPT_FILENAME 确保了 PHP-FPM 能正确找到要执行的脚本路径。
如果数据库连接失败,可能的原因是什么?
直接回答:在 Docker 环境中,ThinkPHP8 连接数据库失败通常是因为 .env 文件中的数据库主机地址配置错误。在容器内,不能直接使用 localhost 或 127.0.0.1 连接另一个容器中的 MySQL 服务,而应该使用 Docker Compose 中定义的 MySQL 服务名称作为主机名。
例如,如果你的 docker-compose.yml 中 MySQL 服务的名称是 mysql,那么 .env 文件中的 DB_HOST 应该设置为 mysql,而不是 127.0.0.1。此外,还需检查数据库用户名、密码、数据库名是否正确,以及 MySQL 容器是否已完全启动并准备好接受连接。可以使用 docker exec -it <container_id> mysql -u <user> -p</user></container_id> 命令进入 PHP 容器测试网络连通性。



















