使用Docker的PHP的多个主机版本

通常,PHP开发人员面临着检查Web应用程序几种解释程序版本的操作的任务。 可以用不同的方法解决。 您可以在一个主机上简单地安装不同版本的PHP,但这充满了库冲突和其他困难。 第二个极端是创建具有不同环境的几个隔离的虚拟机,但是在这里您不能不过度使用硬件资源和不必要地浪费时间来部署工作环境。 目前,解决此问题的最简单方法是使用Docker。

图片

下面,我将描述适用于Ubuntu 18的可行解决方案,其中Nginx + PHP-FPM捆绑包用作堆栈。 该解决方案易于扩展:带有PHP-FPM的容器仅占用300 MB的内存,并且您可以使用三个命令(或运行,具体取决于您的偏好)将容器与其他版本的解释器一起添加。 此解决方案的第二个优点是,开发人员无需在解释程序之间切换Web服务器,因为它们已经被分隔在不同的容器中(应用程序代码相同)。

另外:从评论来看,一些读者不了解所描述的解决方案在哪种情况下合适。 因此,我想提请注意以下所有事实仅在开发人员的工作站上使用,并且可能还适合于带有某些保留的舞台服务器。

所以让我们开始吧...

1.安装Docker


sudo apt update sudo apt install ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce 

2.使用必要的PHP版本安装容器


作为创建工作环境的示例,使用了来自官方PHP Docker存储库的 PHP版本7.1和7.2。 以此类推,如果您有映像,则可以安装所需的任何版本的PHP:

 sudo docker pull php:7.1.25-fpm-stretch sudo docker create --name=fpm71 -p 127.0.0.1:9071:9000 -v /var/www:/var/www php:7.1.25-fpm-stretch sudo docker start fpm71 sudo docker pull php:7.2.13-fpm-stretch sudo docker create --name=fpm72 -p 127.0.0.1:9072:9000 -v /var/www:/var/www php:7.2.13-fpm-stretch sudo docker start fpm72 

默认情况下,PHP-FPM在端口9000上运行。 创建映像时,我们发布了免费的9071和9072主机端口的第9000个容器端口(数字从非特权范围中任意获取)。 此外,我们会将处理PHP的请求代理到这些端口(Nginx虚拟主机配置中的fastcgi_pass参数)。

还必须将项目目录放入容器(/ var / www)中,否则PHP-FPM发誓它看不到文件(如果您知道如何使此刻变得更好/更正确,请在注释中写下)。

检查容器是否正在运行并且端口是否正确发布:

 sudo docker ps -a sudo netstat -lpn 


3.为虚拟主机设置环境


将行添加到/ etc / hosts:
 127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2 

为项目创建目录:

 sudo mkdir -p /var/www/project.local echo '<?php phpinfo(); ?>' | sudo tee /var/www/project.local/index.php 

我为项目(project.local)和虚拟主机(project.local.php71 / 72)取了名字,但是您可以使用方便的名称(只记得更改虚拟主机的设置)。

最初,仅在索引文件中放入一个phpinfo命令,在设置并检查系统性能后,index.php将需要替换为项目中使用的一个。

4.安装nginx并配置虚拟主机


 sudo apt install nginx 

我们使用第一个虚拟主机的描述创建文件/etc/nginx/sites-available/project.local.php71 (它将用于验证PHP v.7.1下的项目操作):

 server { listen 80; server_name project.local.php71; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9071; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 

同样,第二个虚拟主机的/etc/nginx/sites-available/project.local.php72文件:

 server { listen 80; server_name project.local.php72; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9072; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 

现在,我们对虚拟主机的上述配置进行符号链接并重载Nginx:

 cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/project.local.php71 sudo ln -s ../sites-available/project.local.php72 sudo systemctl reload nginx 

5.检查


 curl --silent http://project.local.php71/index.php | grep -o "PHP Version [0-9\.]\{1,\}" curl --silent http://project.local.php72/index.php | grep -o "PHP Version [0-9\.]\{1,\}" 

结果,我们应该得到一个PHP版本(由于不同版本的解释器处理phpinfo命令)。

现在仅需将项目上传到/var/www/project.local文件夹,就可以在位于http://project.local.php71的PHP 7.1解释器和位于http://project.local.php71的 PHP 7.2中检查其操作。

附加材料
1. 完整的Docker实用指南

Source: https://habr.com/ru/post/zh-CN435940/


All Articles