Várias versões de host do PHP usando o Docker

Freqüentemente, os desenvolvedores de PHP têm a tarefa de testar a operação de um aplicativo Web para várias versões do intérprete. Pode ser resolvido de diferentes maneiras. Você pode instalar trivialmente diferentes versões do PHP em um host, mas isso está repleto de conflitos de biblioteca e outras dificuldades. O segundo extremo é criar várias máquinas virtuais isoladas com ambientes diferentes, mas aqui você não pode prescindir do uso excessivo de recursos de hardware e desperdício desnecessário de tempo para implantar um ambiente de trabalho. No momento, a maneira mais fácil de resolver esse problema é com o Docker.

imagem

Abaixo, descreverei uma solução funcional para o Ubuntu 18, onde o pacote Nginx + PHP-FPM é usado como uma pilha. Essa solução é dimensionada facilmente: um contêiner com PHP-FPM ocupa apenas 300 MB de memória e você pode adicionar contêineres com outras versões do intérprete com três comandos (ou executar, dependendo de suas preferências). A segunda vantagem dessa solução é que o desenvolvedor não precisa alternar o servidor da web entre intérpretes, pois eles já estão espaçados em contêineres diferentes (o código do aplicativo é o mesmo).

Além disso: a julgar pelos comentários, alguns leitores não entenderam para quais casos a solução descrita é adequada. Portanto, quero chamar a atenção para o fato de que todos os itens a seguir se destinam apenas ao uso na estação de trabalho do desenvolvedor e também podem ser adequados para um servidor de palco com algumas reservas.

Então, vamos começar ...

1. Instale o 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 contêineres com as versões necessárias do PHP


Como exemplo de criação de um ambiente de trabalho, foram usadas as versões 7.1 e 7.2 do PHP do repositório oficial do PHP Docker . Por analogia, se você tiver uma imagem, poderá instalar qualquer versão do PHP que desejar:

 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 

O PHP-FPM é executado na porta 9000 por padrão. Ao criar as imagens, publicamos as 9000ª portas do contêiner para as portas gratuitas da máquina host 9071 e 9072 (os números são obtidos arbitrariamente no intervalo sem privilégios). Além disso, solicitaremos proxy para processar o PHP nessas portas (o parâmetro fastcgi_pass na configuração do host virtual Nginx).

Também foi necessário jogar o diretório do projeto dentro dos contêineres (/ var / www), caso contrário, o PHP-FPM jura que não vê arquivos (se você souber como tornar esse momento melhor / mais correto, escreva nos comentários).

Verifique se os contêineres estão em execução e se as portas estão publicadas corretamente:

 sudo docker ps -a sudo netstat -lpn 


3. Configure o ambiente para hosts virtuais


Adicione as linhas ao / etc / hosts:
 127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2 

Crie um diretório para o projeto:

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

Peguei o nome do projeto (project.local) e hosts virtuais (project.local.php71 / 72), mas você pode usar nomes que sejam convenientes para você (lembre-se de alterar as configurações dos hosts virtuais).

Inicialmente, apenas um comando phpinfo foi colocado no arquivo de índice. Após configurar e verificar o desempenho do sistema, o index.php precisará ser substituído pelo usado no projeto.

4. Instale o nginx e configure os hosts virtuais


 sudo apt install nginx 

Criamos o arquivo /etc/nginx/sites-available/project.local.php71 com a descrição do primeiro host virtual (ele será usado para verificar a operação do projeto no 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; } } 

Da mesma forma, o arquivo /etc/nginx/sites-available/project.local.php72 para o 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; } } 

Agora criamos links simbólicos para as configurações acima de hosts virtuais e sobrecarregamos o 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. Verifique


 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, devemos obter uma versão do PHP (como resultado do processamento do comando phpinfo por intérpretes de versões diferentes).

Agora resta apenas fazer o upload do seu projeto para a pasta /var/www/project.local e você pode verificar sua operação no interpretador PHP 7.1 em http: //project.local.php71 e PHP 7.2 em http: //project.local.php71 .

Materiais adicionais
1. Guia Prático Completo do Docker

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


All Articles