用Docker实现PHP多版本共存的关键是容器隔离+Nginx反向代理+统一网络,推荐使用DNMP开箱即用方案,预置多PHP版本、独立容器、端口分离、配置可挂载,通过vhost路由域名至对应PHP容器,hosts绑定域名即可访问,无需代理。

用 Docker 实现 PHP 多版本共存,关键不是“装多个 PHP”,而是让不同项目各自运行在匹配的 PHP 环境里,互不干扰。核心靠容器隔离 + Nginx 反向代理 + 统一网络通信,不是手动切换或共用一个 PHP 进程。
选一套成熟方案起步,别从零写 docker-compose
推荐直接使用 DNMP(Docker + Nginx + MySQL + PHP + Redis) 这类开箱即用的全家桶。它已预置 PHP 5.4/5.6/7.1–7.3 多版本服务,每个 PHP 容器独立运行、端口分离、配置可挂载。你不需要自己拉镜像、写 Dockerfile、配 FPM socket,只需:
- 克隆项目(如 Gitee 上的
bruce_qiq/dnmp) - 复制
env.sample为.env,按需启用 PHP5.6 和 PHP7.2 - 运行
docker-compose up -d - 代码放在
www/下对应子目录,比如www/project-old/跑 PHP5.6,www/project-new/跑 PHP7.2
用 Nginx 做路由,把域名指向对应 PHP 版本
DNMP 的 Nginx 默认支持虚拟主机,你只需在 services/nginx/conf/vhost/ 下新增配置文件,例如 old.test.conf:
server {
listen 80;
server_name old.test;
root /www/project-old;
index index.php;
<pre class="brush:php;toolbar:false;">location ~ \.php$ {
fastcgi_pass php56:9000; # 指向 PHP5.6 容器的服务名
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}}
同理,new.test.conf 中把 fastcgi_pass 改成 php72:9000。改完 reload Nginx 即可生效。
本地域名解析 + 浏览器代理,模拟真实访问
macOS 或 Linux 直接改 /etc/hosts:
127.0.0.1 old.test 127.0.0.1 new.test
但注意:hosts 不支持端口,所以不能写 127.0.0.1:9000。若你用的是单容器单端口直连方式(如 php7-2-x.zip 那种),就得借助浏览器插件(如 Chrome 的 Simple Proxy)把 old.test 请求代理到 127.0.0.1:8082;而 DNMP 这类统一走 Nginx 的方案,就完全不需要代理,hosts + vhost 就够了。
扩展和调试按需安装,不全局污染
PHP 扩展不是装一次全有,而是按容器单独装。比如进 PHP5.6 容器装 Redis 扩展:
docker exec -it dnmp_php56_1 bash # 容器内执行: apt update && apt install -y zlib1g-dev docker-php-ext-install redis
装完重启该容器即可,不影响 PHP7.2。Xdebug 同理,只在需要调试的版本里启用,避免性能损耗。DNMP 还提供了封装好的命令:install-php-extensions redis,更省事。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











