Varias versiones de host de PHP con Docker

A menudo, los desarrolladores de PHP tienen la tarea de probar el funcionamiento de una aplicación web para varias versiones del intérprete. Se puede resolver de diferentes maneras. Puede instalar trivialmente diferentes versiones de PHP en un host, pero esto está plagado de conflictos de biblioteca y otras dificultades. El segundo extremo es crear varias máquinas virtuales aisladas con diferentes entornos, pero aquí no se puede prescindir del uso excesivo de los recursos de hardware y la pérdida innecesaria de tiempo para implementar un entorno de trabajo. Por el momento, la forma más fácil de resolver este problema es con Docker.

imagen

A continuación, describiré una solución de trabajo para Ubuntu 18, donde el paquete Nginx + PHP-FPM se usa como una pila. Esta solución se escala fácilmente: un contenedor con PHP-FPM ocupa solo 300 MB en memoria, y puede agregar contenedores con otras versiones del intérprete con tres comandos (o ejecutar, según sus preferencias). La segunda ventaja de esta solución es que el desarrollador no necesita cambiar el servidor web entre intérpretes, ya que ya están espaciados en diferentes contenedores (el código de la aplicación es el mismo).

Adición: a juzgar por los comentarios, algunos lectores no entendieron para qué casos la solución descrita es adecuada. Por lo tanto, quiero llamar la atención sobre el hecho de que todo lo siguiente está destinado a usarse SOLO en la estación de trabajo del desarrollador, y también puede ser adecuado para un servidor de escenario con algunas reservas.

Así que empecemos ...

1. Instalar 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. Instale contenedores con las versiones necesarias de PHP


Como ejemplo de creación de un entorno de trabajo, se utilizaron las versiones de PHP 7.1 y 7.2 del repositorio oficial de PHP Docker . Por analogía, si tiene una imagen, puede instalar cualquier versión de PHP que desee:

 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 se ejecuta en el puerto 9000 de forma predeterminada. Al crear las imágenes, publicamos los puertos de contenedor número 9000 para los puertos de máquina host 9071 y 9072 libres (los números se toman arbitrariamente del rango no privilegiado). Además, enviaremos solicitudes para procesar PHP a estos puertos (el parámetro fastcgi_pass en la configuración del host virtual Nginx).

También fue necesario lanzar el directorio del proyecto dentro de los contenedores (/ var / www), de lo contrario PHP-FPM jura que no ve archivos (si sabe cómo hacer que este momento sea mejor / más correcto, escriba los comentarios).

Verifique que los contenedores se estén ejecutando y que los puertos estén publicados correctamente:

 sudo docker ps -a sudo netstat -lpn 


3. Configure el entorno para hosts virtuales


Agregue las líneas a / etc / hosts:
 127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2 

Cree un directorio para el proyecto:

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

Tomé el nombre del proyecto (project.local) y los hosts virtuales (project.local.php71 / 72), pero puede usar nombres que sean convenientes para usted (solo recuerde cambiar la configuración de los hosts virtuales).

Inicialmente, solo se colocó un comando phpinfo en el archivo de índice, después de configurar y verificar el rendimiento del sistema, index.php tendrá que ser reemplazado por el utilizado en el proyecto.

4. Instale nginx y configure hosts virtuales


 sudo apt install nginx 

Creamos el archivo /etc/nginx/sites-available/project.local.php71 con la descripción del primer host virtual (se utilizará para verificar el funcionamiento del proyecto en 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; } } 

Del mismo modo, el archivo /etc/nginx/sites-available/project.local.php72 para el segundo host virtual:

 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; } } 

Ahora hacemos enlaces simbólicos a las configuraciones anteriores de hosts virtuales y sobrecargamos 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. Verificar


 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,\}" 

Como resultado, deberíamos obtener una versión de PHP (como resultado del procesamiento del comando phpinfo por parte de intérpretes de diferentes versiones).

Ahora solo queda cargar su proyecto en la carpeta /var/www/project.local y puede verificar su funcionamiento en el intérprete PHP 7.1 en http: //project.local.php71 y PHP 7.2 en http: //project.local.php71 .

Materiales adicionales
1. Guía práctica completa de Docker

Source: https://habr.com/ru/post/es435940/


All Articles