Mehrere Hostversionen von PHP mit Docker

Oft haben PHP-Entwickler die Aufgabe, den Betrieb einer Webanwendung für mehrere Versionen des Interpreters zu testen. Es kann auf verschiedene Arten gelöst werden. Sie können trivial verschiedene Versionen von PHP auf einem Host installieren, dies ist jedoch mit Bibliothekskonflikten und anderen Schwierigkeiten behaftet. Das zweite Extrem besteht darin, mehrere isolierte virtuelle Maschinen mit unterschiedlichen Umgebungen zu erstellen. Hier können Sie jedoch nicht auf übermäßigen Einsatz von Hardwareressourcen und unnötige Zeitverschwendung bei der Bereitstellung einer Arbeitsumgebung verzichten. Derzeit ist Docker der einfachste Weg, um dieses Problem zu lösen.

Bild

Im Folgenden werde ich eine funktionierende Lösung für Ubuntu 18 beschreiben, bei der das Nginx + PHP-FPM-Bundle als Stack verwendet wird. Diese Lösung lässt sich leicht skalieren: Ein Container mit PHP-FPM benötigt nur 300 MB Speicher, und Sie können Container mit anderen Versionen des Interpreters mit drei Befehlen hinzufügen (oder je nach Ihren Einstellungen ausführen). Das zweite Plus dieser Lösung ist, dass der Entwickler den Webserver nicht zwischen Interpreten wechseln muss, da diese bereits in verschiedenen Containern angeordnet sind (der Anwendungscode ist der gleiche).

Ergänzung: Nach den Kommentaren zu urteilen, haben einige Leser nicht verstanden, für welche Fälle die beschriebene Lösung geeignet ist. Daher möchte ich darauf hinweisen, dass alle folgenden Funktionen NUR für die Verwendung auf der Workstation des Entwicklers vorgesehen sind und mit einigen Vorbehalten auch für einen Bühnenserver geeignet sein können.

Also fangen wir an ...

1. Installieren Sie 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. Installieren Sie Container mit den erforderlichen Versionen von PHP


Als Beispiel für die Erstellung einer Arbeitsumgebung wurden die PHP-Versionen 7.1 und 7.2 aus dem offiziellen PHP Docker-Repository verwendet . Wenn Sie ein Image haben, können Sie analog jede gewünschte PHP-Version installieren:

 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 läuft standardmäßig auf Port 9000. Bei der Erstellung der Images haben wir die 9000. Container-Ports für die kostenlosen Host-Maschinen-Ports 9071 und 9072 veröffentlicht (Nummern werden willkürlich aus dem nicht privilegierten Bereich übernommen). Außerdem werden Anfragen zur Verarbeitung von PHP an diese Ports weitergeleitet (der Parameter fastcgi_pass in der Konfiguration des virtuellen Nginx-Hosts).

Es war auch notwendig, das Projektverzeichnis (/ var / www) innerhalb der Container weiterzuleiten, andernfalls schwört PHP-FPM, dass keine Dateien angezeigt werden (wenn Sie wissen, wie Sie diesen Moment verbessern / korrekter gestalten können, schreiben Sie in die Kommentare).

Überprüfen Sie, ob die Container ausgeführt werden und die Ports korrekt veröffentlicht wurden:

 sudo docker ps -a sudo netstat -lpn 


3. Richten Sie die Umgebung für virtuelle Hosts ein


Fügen Sie die Zeilen zu / etc / hosts hinzu:
 127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2 

Erstellen Sie ein Verzeichnis für das Projekt:

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

Ich habe den Namen für das Projekt (project.local) und die virtuellen Hosts (project.local.php71 / 72) verwendet, aber Sie können für Sie geeignete Namen verwenden (denken Sie daran, die Einstellungen der virtuellen Hosts zu ändern).

Zunächst wurde nur ein Befehl phpinfo in die Indexdatei eingefügt. Nach dem Einrichten und Überprüfen der Systemleistung muss index.php durch den im Projekt verwendeten ersetzt werden.

4. Installieren Sie nginx und konfigurieren Sie virtuelle Hosts


 sudo apt install nginx 

Wir erstellen die Datei /etc/nginx/sites-available/project.local.php71 mit der Beschreibung des ersten virtuellen Hosts (sie wird verwendet, um den Betrieb des Projekts unter PHP v.7.1 zu überprüfen):

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

Ebenso die Datei /etc/nginx/sites-available/project.local.php72 für den zweiten virtuellen Host:

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

Jetzt erstellen wir Symlinks zu den oben genannten Konfigurationen von virtuellen Hosts und überladen 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. Überprüfen Sie


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

Als Ergebnis sollten wir eine Version von PHP erhalten (als Ergebnis der Verarbeitung des Befehls phpinfo durch Interpreter verschiedener Versionen).

Jetzt müssen Sie Ihr Projekt nur noch in den Ordner /var/www/project.local hochladen, und Sie können seine Funktionsweise im PHP 7.1-Interpreter unter http: //project.local.php71 und PHP 7.2 unter http: //project.local.php71 überprüfen .

Zusätzliche Materialien
1. Vollständiges Docker-Handbuch

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


All Articles