需通过Dockerfile构建PHP镜像、docker-compose编排服务、.env分离配置、启用Apache重写模块;具体包括:一、基础Dockerfile定义环境与权限;二、多阶段构建精简镜像;三、docker-compose.yml统一管理Web与MySQL;四、.env.docker注入敏感配置;五、确保mod_rewrite启用及.htaccess生效。

如果您希望将ThinkPHP6.x项目以容器化方式部署,需通过定制Dockerfile构建可运行的PHP应用镜像,并借助docker-compose.yml编排Web服务与依赖组件。以下是实现该目标的具体路径:
一、编写基础Dockerfile构建ThinkPHP6.x运行镜像
Dockerfile定义了ThinkPHP6.x容器的运行环境,包括PHP版本、必要扩展、目录结构、权限设置及启动命令。使用php:8.1-apache作为基础镜像可直接支持HTTP服务,避免额外配置Nginx反向代理。
1、在项目根目录创建名为Dockerfile的文件。
2、写入以下内容:
立即学习“PHP免费学习笔记(深入)”;
FROM php:8.1-apache
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install gd pdo_mysql opcache
COPY . /var/www/html/
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/runtime
RUN a2enmod rewrite
EXPOSE 80
CMD ["apache2-foreground"]
3、确保项目中storage和runtime目录存在且具备写入能力,否则容器启动后将无法记录日志或缓存。
二、使用多阶段构建精简镜像体积
为降低镜像大小并提升安全性,可采用多阶段构建:第一阶段安装构建依赖(如Composer)并执行composer install;第二阶段仅复制已安装的vendor与代码,不保留构建工具和临时文件。
1、在Dockerfile中定义构建阶段:
FROM php:8.1-cli AS builder
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader
FROM php:8.1-apache
RUN docker-php-ext-install pdo_mysql opcache
COPY --from=builder /app/vendor /var/www/html/vendor
COPY . /var/www/html/
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/runtime
RUN a2enmod rewrite
EXPOSE 80
CMD ["apache2-foreground"]
2、执行docker build --target builder -t tp6-builder .跳过构建阶段验证。
3、执行docker build -t my-tp6-app .构建最终运行镜像。
三、编写docker-compose.yml编排Web与数据库服务
docker-compose.yml用于统一管理ThinkPHP6.x应用容器与MySQL数据库容器,实现网络互通、环境变量注入及持久化卷挂载,避免硬编码配置。
1、在项目根目录创建docker-compose.yml文件。
2、写入以下内容:
立即学习“PHP免费学习笔记(深入)”;
version: '3.8'
services:
web:
build: .
ports:
- "8080:80"
environment:
- APP_DEBUG=true
- DB_HOST=db
- DB_NAME=thinkphp
- DB_USER=root
- DB_PASS=123456
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=thinkphp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
3、确认.env文件中DB_HOST值设为db,与compose中服务名一致,否则数据库连接将因DNS解析失败而中断。
四、通过.env文件分离敏感配置并注入容器
将数据库密码、调试开关等敏感或环境相关参数从代码中剥离,交由.dockerignore保护的.env文件管理,并在容器启动时注入到PHP运行时环境中。
1、在项目根目录创建.env.docker文件,内容如下:
APP_DEBUG=true
DB_HOST=db
DB_NAME=thinkphp
DB_USER=root
DB_PASS=123456
2、修改docker-compose.yml中web服务部分,添加:
env_file:
- .env.docker
3、在ThinkPHP6.x入口文件public/index.php顶部或bootstrap/app.php中插入:
if (file_exists(__DIR__.'/../.env.docker')) {
$env = parse_ini_file(__DIR__.'/../.env.docker');
foreach ($env as $k => $v) { putenv("{$k}={$v}"); }
}
4、务必确保.env.docker不被提交至Git仓库,且在.dockerignore中显式声明。
五、启用Apache重写模块并校验.htaccess生效
ThinkPHP6.x默认依赖URL重写实现路由访问,若未启用mod_rewrite或AllowOverride未开放,将导致所有请求返回404或直接暴露index.php入口。
1、确认Dockerfile中已执行a2enmod rewrite指令。
2、在Apache配置中启用AllowOverride All,可在Dockerfile末尾追加:
RUN echo "<Directory /var/www/html> AllowOverride All </Directory>" >> /etc/apache2/apache2.conf
3、在项目public目录下确认存在.htaccess文件,其内容应包含ThinkPHP官方提供的标准重写规则。
4、容器启动后,执行docker exec -it <container_id> apache2ctl -M | grep rewrite验证rewrite_module是否已加载。



















