docker实现php多版本共存的核心是各版本运行于独立容器,通过nginx反向代理、域名路由或端口隔离区分访问,共享mysql/redis等基础服务,挂载项目代码与配置,确保环境隔离、互不干扰。

用 Docker 实现 PHP 多版本共存,核心是让每个 PHP 版本运行在独立容器中,通过 Nginx 统一反向代理、端口隔离或域名路由来区分访问,互不干扰。不需要切换全局 PHP,也不用担心扩展冲突或配置覆盖。
用 docker-compose 分别定义不同 PHP 版本服务
每个版本单独一个服务块,镜像明确指定,端口不重叠:
- PHP 5.6 服务:使用
php:5.6-fpm镜像,暴露内部端口9000,容器名设为php56 - PHP 7.2 服务:使用
php:7.2-fpm-alpine镜像,同样暴露9000,但容器名设为php72 - Nginx 服务统一配置多个
upstream,分别指向php56:9000和php72:9000 - 通过
volumes挂载各自项目的代码目录(如./project-a:/var/www/html)和自定义配置(如 php.ini、fpm 配置)
通过 Nginx 虚拟主机做请求分发
不靠端口,靠域名区分环境更贴近真实部署:
- 在宿主机
/etc/hosts添加两行:127.0.0.1 old-project.test127.0.0.1 new-project.test - Nginx 配置两个
server块,server_name分别对应上述域名 - old-project.test 的
fastcgi_pass指向php56:9000;new-project.test 指向php72:9000 - 这样访问
http://old-project.test自动走 PHP 5.6,http://new-project.test走 PHP 7.2
共享基础服务,避免重复启动
数据库、Redis 等中间件无需每个 PHP 环境都配一套:
- 在同一个
docker-compose.yml中定义mysql、redis服务 - 所有 PHP 容器通过 Docker 内网(默认 bridge 网络)直接用服务名连接,例如
host: mysql、host: redis - PHP 项目里用
mysqli_connect('mysql', 'root', 'pass')即可,不用写127.0.0.1 - 数据卷挂载到宿主机,确保重启容器后数据不丢失
快速切换与日常维护技巧
开发中高频操作可以简化成命令或脚本:
- 启动某版本环境:
docker-compose up -d php72 nginx(只启需要的) - 进容器装扩展:
docker exec -it php72 sh -c "docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql" - 查看日志:
docker-compose logs -f php56或nginx - PHP CLI 在容器内执行:
docker exec php72 php -v,或挂载composer到宿主机复用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











