深入解析 aschmelyun/docker-compose-laravel 中的 PHP Dockerfile 配置
2025-07-10 08:18:41作者:邵娇湘
概述
在 Laravel 项目的 Docker 化部署中,PHP 容器的配置是核心环节之一。本文将以 aschmelyun/docker-compose-laravel 项目中的 PHP Dockerfile 为例,详细解析其构建过程和优化点,帮助开发者理解如何为 Laravel 应用构建高效的 PHP 运行环境。
基础镜像选择
FROM php:8-fpm-alpine
该 Dockerfile 选择了 php:8-fpm-alpine
作为基础镜像,这是一个明智的选择:
- Alpine Linux:轻量级的 Linux 发行版,显著减小镜像体积
- PHP 8:使用最新的 PHP 主版本,确保应用能使用最新特性
- FPM:PHP-FPM (FastCGI Process Manager) 是运行 PHP 应用的高效方式
用户权限管理
ARG UID
ARG GID
ENV UID=${UID}
ENV GID=${GID}
RUN delgroup dialout
RUN addgroup -g ${GID} --system laravel
RUN adduser -G laravel --system -D -s /bin/sh -u ${UID} laravel
这部分配置解决了容器内外用户权限一致性问题:
- 通过 ARG 指令允许构建时传入用户和组 ID
- 删除默认的 dialout 组(与 MacOS staff 组 GID 冲突)
- 创建专门的 laravel 用户和组,确保容器内外的文件权限一致
PHP-FPM 配置调整
RUN sed -i "s/user = www-data/user = laravel/g" /usr/local/etc/php-fpm.d/www.conf
RUN sed -i "s/group = www-data/group = laravel/g" /usr/local/etc/php-fpm.d/www.conf
RUN echo "php_admin_flag[log_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf
对 PHP-FPM 的默认配置进行了三项重要修改:
- 将运行用户从 www-data 改为 laravel
- 将运行组从 www-data 改为 laravel
- 启用错误日志记录,便于调试
依赖安装与扩展配置
RUN docker-php-ext-install pdo pdo_mysql
RUN mkdir -p /usr/src/php/ext/redis \
&& curl -L https://github.com/phpredis/phpredis/archive/5.3.4.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
&& echo 'redis' >> /usr/src/php-available-exts \
&& docker-php-ext-install redis
这部分安装了 Laravel 应用常用的 PHP 扩展:
- PDO 和 MySQL 扩展:数据库操作的基础
- Redis 扩展:通过源码编译安装特定版本(5.3.4),支持缓存和队列功能
值得注意的是 Redis 扩展的安装方式:
- 先下载指定版本的源码
- 然后使用 docker-php-ext-install 工具编译安装
- 这种方式比直接使用 pecl 安装更可控
工作目录与 Composer 配置
RUN mkdir -p /var/www/html
WORKDIR /var/www/html
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
- 创建标准 web 目录
/var/www/html
- 设置为工作目录
- 从官方 Composer 镜像复制 composer 可执行文件,比直接安装更高效
最终配置
USER laravel
CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"]
- 切换到 laravel 用户运行,提高安全性
- 启动 PHP-FPM 服务,并指定配置文件和允许以 root 身份启动 worker 进程(-R)
最佳实践分析
这个 Dockerfile 体现了多个 Docker 和 PHP 的最佳实践:
- 最小化镜像:基于 Alpine,只安装必要的扩展
- 安全性:使用非 root 用户运行应用
- 可维护性:清晰的注释和逻辑分段
- 可配置性:允许通过构建参数自定义 UID/GID
- 性能优化:精心选择的扩展和配置
扩展建议
对于实际项目,可能需要考虑添加:
- OPcache 配置
- 其他常用扩展如 bcmath、xml、zip 等
- 生产环境特定的 PHP 配置优化
- 健康检查指令
总结
这个 PHP Dockerfile 为 Laravel 应用提供了一个高效、安全的运行环境基础。通过理解其设计思路和实现细节,开发者可以根据自己的项目需求进行定制和扩展,构建更适合自己项目的 Docker 镜像。