📦 简化的PHP Docker镜像,支持轻松定制和扩展设置。
本PHP Docker镜像基于***PHP Docker镜像构建,支持PHP 5.6至8.5(beta)版本,提供CLI、ZTS、FPM、FPM/Apache2、FPM/Nginx、RoadRunner和FrankenPHP等多种变体,同时提供Debian和Alpine两种基础版本。
核心优势包括:
适用场景:快速搭建PHP开发环境、生产环境部署、多版本PHP项目兼容、需要灵活配置PHP参数的场景。
cli、zts、fpm、fpm-nginx、fpm-apache、roadrunner(PHP ≥8.0)、frankenphp(PHP ≥8.2,beta)PHP_*环境变量直接自定义php.ini和php-fpm.conf参数(如PHP_DISPLAY_ERRORS=1)ALLOW_RUNTIME_PHP_ENVVARS=1)APP_PATH)和文档根目录(DOCUMENT_ROOT)phpaddmod命令一键安装额外扩展(如phpaddmod imagick xdebug),自动处理依赖和配置onboot、first-run、migration等多种钩子脚本,定制容器生命周期行为/startup/目录下的脚本会按文件名顺序自动执行ENABLE_CRONTAB=1启用crontab服务,支持环境变量定义任务APP_USER、APP_UID等环境变量自定义容器内用户和组| 场景 | 推荐变体 | 核心优势 |
|---|---|---|
| PHP命令行工具开发 | cli、zts | 轻量、支持多PHP版本 |
| 生产环境Web服务 | fpm-nginx、fpm-apache | 稳定、预配置Web服务器、支持动态PHP配置 |
| 高性能API服务 | roadrunner、frankenphp | 基于Go的高性能服务器,适合长连接场景 |
| 多版本PHP项目兼容测试 | 全变体 | 覆盖5.6至8.5版本,满足 legacy 项目需求 |
| 需要自定义PHP扩展的项目 | 全变体 | phpaddmod工具简化扩展安装 |
| 开发环境快速搭建 | fpm-nginx、fpm-apache | 预安装Composer和Web服务器,开箱即用 |
镜像标签格式为shinsenter/php:[PHP版本]-[变体],支持以下变体:
| 变体 | 说明 | PHP版本要求 |
|---|---|---|
cli | 命令行模式 | 5.6+ |
zts | 线程安全模式 | 5.6+ |
fpm | PHP-FPM模式 | 5.6+ |
fpm-apache | PHP-FPM + Apache2服务器 | 5.6+ |
fpm-nginx | PHP-FPM + Nginx服务器 | 5.6+ |
roadrunner | 集成RoadRunner服务器(基于Go的高性能应用服务器) | 8.0+ |
frankenphp | 集成FrankenPHP服务器(基于Caddy的PHP运行时,beta版) | 8.2+ |
示例标签:
shinsenter/php:7.4-cli(PHP 7.4,CLI模式)shinsenter/php:8.1-fpm-nginx(PHP 8.1,FPM+Nginx)shinsenter/php:8.3-roadrunner(PHP 8.3,RoadRunner)shinsenter/php:8.4-frankenphp(PHP 8.4,FrankenPHP)所有标签可在Docker Hub查看。
shell# 非交互式运行(查看PHP模块) docker run --rm shinsenter/php:8.4-cli php -m # 交互式运行(挂载本地项目) docker run -it -v ./myproject:/var/www/html shinsenter/php:8.4-cli
shelldocker run -v ./myproject:/var/www/html -p 9000:9000 shinsenter/php:8.4-fpm
shell# FPM+Nginx(映射80/443端口) docker run -v ./myproject:/var/www/html -p 80:80 -p 443:443 shinsenter/php:8.4-fpm-nginx # FPM+Apache docker run -v ./myproject:/var/www/html -p 80:80 -p 443:443 shinsenter/php:8.4-fpm-apache
yamlversion: '3' services: web: image: shinsenter/php:8.4-fpm-nginx ports: - "80:80" - "443:443" volumes: - ./myproject:/var/www/html environment: PHP_DISPLAY_ERRORS: "1" # 显示错误信息 PHP_POST_MAX_SIZE: "100M" # 最大POST大小 PHP_UPLOAD_MAX_FILESIZE: "100M" # 最大上传文件大小 APP_PATH: "/var/www/html" # 应用目录(默认) DOCUMENT_ROOT: "public" # 文档根目录(相对于APP_PATH)
通过PHP_*环境变量自定义php.ini或php-fpm.conf参数,命名规则为:PHP_ + 配置项的常量名(原配置项中的点/横杠替换为下划线,大写)。
| 环境变量 | 说明 | 对应PHP配置项 |
|---|---|---|
PHP_DISPLAY_ERRORS=1 | 开发环境显示错误 | display_errors = 1 |
PHP_POST_MAX_SIZE=100M | 最大POST数据大小 | post_max_size = 100M |
PHP_UPLOAD_MAX_FILESIZE=100M | 最大上传文件大小 | upload_max_filesize = 100M |
PHP_SESSION_COOKIE_HTTPONLY=1 | 会话Cookie启用HttpOnly标志 | session.cookie_httponly = 1 |
PHP_MEMORY_LIMIT=512M | PHP内存限制 | memory_limit = 512M |
命令行:
shelldocker run \ -v ./myproject:/var/www/html \ -e PHP_DISPLAY_ERRORS='1' \ -e PHP_POST_MAX_SIZE='100M' \ shinsenter/php:8.4-fpm-nginx
运行时动态调整配置:
默认PHP_*变量仅在容器启动时生效,若需在容器内运行命令时动态调整,需设置ALLOW_RUNTIME_PHP_ENVVARS=1:
shelldocker run -e ALLOW_RUNTIME_PHP_ENVVARS=1 shinsenter/php:8.4-cli # 容器内执行:PHP_DISPLAY_ERRORS=1 php -i | grep display_errors
/var/www/html,可通过APP_PATH环境变量自定义。APP_PATH的子目录(默认空,即APP_PATH本身),可通过DOCUMENT_ROOT自定义。示例:
shell# 将应用目录设置为/app,文档根目录为/app/public docker run \ -v ./myproject:/app \ -e APP_PATH=/app \ -e DOCUMENT_ROOT=public \ -p 80:80 \ shinsenter/php:8.4-fpm-nginx
使用phpaddmod命令一键安装PHP扩展,自动处理依赖、编译和配置。该命令是mlocati/docker-php-extension-installer的封装,支持大部分主流扩展。
dockerfileFROM shinsenter/php:8.4-fpm-nginx # 安装imagick、swoole、xdebug扩展 RUN phpaddmod imagick swoole xdebug # 复制项目代码(指定用户权限) ADD --chown=$APP_USER:$APP_GROUP ./myproject/ /var/www/html/
支持的扩展列表参考:mlocati/docker-php-extension-installer文档
通过环境变量自定义容器内运行应用的用户和组,避免权限问题。
| 环境变量 | 说明 | 默认值 |
|---|---|---|
APP_USER | 用户名 | www-data |
APP_GROUP | 组名 | www-data |
APP_UID | 用户UID | 容器内默认UID |
APP_GID | 组GID | 容器内默认GID |
示例:
yaml# docker-compose.yml services: web: image: shinsenter/php:8.4-fpm-nginx environment: APP_USER: "myapp" # 自定义用户名 APP_UID: "5000" # 自定义UID(与宿主机用户匹配可避免权限问题)
钩子脚本用于在容器生命周期的特定阶段执行自定义逻辑,支持以下钩子:
| 钩子名称 | 触发时机 | 典型用途 |
|---|---|---|
onboot | 容器启动或重启时 | 发送启动通知 |
first-run | 容器首次启动时(仅一次) | 初始化数据库 |
rebooted | 容器重启时 | 检查崩溃日志 |
migration | 应用启动前 | 执行数据库迁移 |
onready | migration后,应用准备就绪时 | 预热缓存 |
onlive | Web服务器启动后(若包含Web服务器) | 触发外部webhook |
在APP_PATH目录下创建hooks文件夹,添加与钩子名称同名的可执行脚本(或子目录中的脚本):
/var/www/html/ └── hooks/ ├── first-run # 首次启动执行 ├── migration # 迁移脚本 └── onlive/ # onlive钩子的多个脚本 ├── 01-webhook └── 02-notify
提示:设置
DEBUG=1可查看钩子执行日志。
/startup/目录下的shell脚本会在容器启动时按文件名顺序自动执行,用于初始化项目(如数据库迁移、依赖安装等)。
Dockerfile中添加脚本:
dockerfileFROM shinsenter/php:8.4-cli # 添加自动运行脚本(确保可执行权限) ADD ./scripts/00-migration /startup/00-migration RUN chmod +x /startup/00-migration
禁用自动运行:
设置环境变量DISABLE_AUTORUN_SCRIPTS=1。
启用crontab服务需设置ENABLE_CRONTAB=1,任务定义可通过以下方式添加:
CRONTAB_DIR(默认/etc/crontab.d)CRONTAB_SETTINGS环境变量直接定义(适合docker-compose)| 环境变量 | 说明 | 默认值 |
|---|---|---|
ENABLE_CRONTAB=1 | 启用crontab服务 | 未设置(禁用) |
CRONTAB_DIR | 任务文件目录 | /etc/crontab.d |
CRONTAB_HOME | 任务执行的HOME目录 | $APP_PATH |
CRONTAB_SETTINGS | 直接定义任务(换行分隔多个任务) | 未设置 |
CRONTAB_TZ | 任务时区 | $TZ(默认UTC) |
docker-compose.yml:
yamlservices: web: image: shinsenter/php:8.4-fpm-nginx environment: ENABLE_CRONTAB: "1" CRONTAB_TZ: "Asia/Shanghai" CRONTAB_SETTINGS: | * * * * * echo "每分钟执行" >> /var/log/cron.log 0 0 * * * php /var/www/html/artisan backup # 每日凌晨执行备份
通过SUPERVISOR_PHP_COMMAND环境变量自定义容器启动命令,替代默认Web服务器或FPM进程。
示例:
shell# 使用PHP内置Web服务器运行项目 docker run \ -e SUPERVISOR_PHP_COMMAND='php -S 0.0.0.0:80 index.php' \ shinsenter/php:8.4
镜像使用msmtp替代sendmail,支持通过SMTP发送邮件。若使用PHP mail()函数,需配置以下环境变量:
| 环境变量 | 说明 | 示例值 |
|---|---|---|
SMTP_HOST | SMTP服务器地址 | smtp.gmail.com |
SMTP_PORT | SMTP端口 | 587 |
SMTP_USER | SMTP认证用户名 | *** |
SMTP_PASSWORD | SMTP认证密码 | password |
SMTP_FROM | 发件人*** | *** |
SMTP_AUTH=on | 启用SMTP认证 | on |
SMTP_TLS=on | 启用TLS加密 | on |
开发环境示例(使用Mailpit容器作为SMTP服务器):
yamlversion: '3' services: web: image: shinsenter/php:8.4-fpm-nginx environment: SMTP_HOST: mailpit SMTP_PORT: 1025 mailpit: image: axllent/mailpit ports: - "8025:8025" # Web管理界面
设置DEBUG=1启用详细日志输出,便于排查配置或启动问题:
shelldocker run -e DEBUG=1 shinsenter/php:8.4-fpm-nginx
| 环境变量 | 默认值 | 说明 |
|---|---|---|
TZ | UTC | 容器时区(如Asia/Shanghai) |
INITIAL_PROJECT | 未设置 | 若应用目录为空,自动创建Composer项目(如laravel/laravel)或拉取Git仓库 |
COMPOSER_OPTIMIZE_AUTOLOADER=1 | 未设置 | Composer安装时启用--optimize-autoloader,优化生产环境性能 |

来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429