Entwicklung fĂŒr Docker. Lokale Umgebung. Teil 2 - Nginx + PHP + MySql + phpMyAdmin

Zum besseren VerstÀndnis des folgenden Materials wird empfohlen, zuerst den vorherigen Beitrag zu lesen

Betrachten Sie ein Beispiel fĂŒr die Entwicklung einer lokalen Umgebung, die aus einer Reihe von Nginx + PHP + MySql + phpMyAdmin besteht. Dieses Bundle ist sehr beliebt und kann eine Reihe von Standardanforderungen eines normalen Entwicklers erfĂŒllen.

Wie im vorherigen Beitrag wird der Schwerpunkt auf das Docker-Compose-Dienstprogramm als auf den Docker in seiner reinsten Form verlagert.

Also lass uns gehen!

Beginnen wir mit docker-compose.yml, das sich in einem separaten Proxy-Ordner befindet:

docker-compose.yml fĂŒr nginx-proxy
version: '3.0' services: proxy: image: jwilder/nginx-proxy ports: - 80:80 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy networks: proxy: driver: bridge 


Die dargestellte Datei beschreibt die Konfiguration zum Erstellen eines Containers mit dem Namen Proxy auf der Grundlage des Abbilds: jwilder / nginx-proxy image und zum Erstellen eines Netzwerks mit demselben Namen. Die Netzwerkanweisung gibt an, mit welchen Netzwerken der Container verbunden ist. In diesem Beispiel ist dies unser Proxy-Netzwerk.

Beim Erstellen eines Netzwerks kann die Direktive driver: bridge weggelassen werden. Ein BrĂŒckentreiber ist der Standardtreiber. Dieser Container kommuniziert ĂŒber das Netzwerk mit anderen Containern.

Das jwilder / nginx-proxy-Image ist einfach und aufgenommen, und der Docker Hub bietet auch eine ziemlich ausfĂŒhrliche und detaillierte Beschreibung seiner Verwendung. Das Funktionsprinzip von nginx-proxy ist recht einfach: Es greift ĂŒber einen weitergeleiteten Docker-Socket auf Informationen zum AusfĂŒhren von Containern zu, analysiert das Vorhandensein einer Umgebungsvariablen mit dem Namen VIRTUAL_HOST und leitet Anforderungen vom angegebenen Host an den Container um, fĂŒr den diese Umgebungsvariable festgelegt ist.

Wir starten den Proxy mit dem bereits bekannten Befehl docker-compose up -d und beobachten die folgende Ausgabe:

 Creating network "proxy_proxy" with driver "bridge" Creating proxy_proxy_1 ... done 

Diese Schlussfolgerung informiert uns darĂŒber, dass zu Beginn das Netzwerk proxy_proxy und anschließend der Container proxy_proxy_1 erstellt wurde. Der Netzwerkname ergibt sich aus dem Namen des Ordners, in dem sich die Datei docker-compose.yml befand. Ich habe einen Proxy und den gleichnamigen Netzwerknamen.

Wenn Sie den Befehl docker network ls eingeben, wird eine Liste der Docker-Netzwerke in unserem System angezeigt. Eines davon sollte proxy_proxy sein.

Der Containername basiert auf dem gleichen Prinzip wie der Ordnername sowie der Dienstname und die Dienstnummer, sodass Container mit Àhnlichen Namen nicht dupliziert werden können. Mit der Anweisung container_name können Sie den Namen des Containers explizit angeben, aber ich finde dies eine ziemlich nutzlose Funktion. Dies wird in den folgenden BeitrÀgen nÀher erlÀutert.

Erstellen Sie eine zweite docker-compose.yml mit folgendem Inhalt:

docker-compose.yml fĂŒr andere Dienste
 version: '3.0' services: nginx: image: nginx environment: - VIRTUAL_HOST=site.local depends_on: - php volumes: - ./docker/nginx/conf.d/default.nginx:/etc/nginx/conf.d/default.conf - ./html/:/var/www/html/ networks: - frontend - backend php: build: context: ./docker/php volumes: - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./html/:/var/www/html/ networks: - backend mysql: image: mysql:5.7 volumes: - ./docker/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root networks: - backend phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: - VIRTUAL_HOST=phpmyadmin.local - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root networks: - frontend - backend networks: frontend: external: name: proxy_proxy backend: 


Was wird hier angekĂŒndigt?

Es werden vier Dienste aufgelistet: nginx, php, mysql und phpmyadmin. Und zwei Netzwerke. Ein Proxy-Netzwerk namens Frontend wird als externes Netzwerk und neues internes Backend-Netzwerk angekĂŒndigt. Der Treiber dafĂŒr ist nicht angegeben, wie ich zuvor geschrieben habe, der Standardtreiber des BrĂŒckentyps wird verwendet.

Nginx


Hier sollte alles klar sein. Wir verwenden das Basis-Image mit dem Docker-Hub. Die Umgebungsvariable ist erforderlich, damit der Proxy funktioniert, und gibt an, an welcher Adresse auf den Container zugegriffen werden soll. Die Option abhĂ€ngige_on gibt die AbhĂ€ngigkeit dieses Containers vom PHP-Container an. Dies bedeutet, dass der PHP-Container im Voraus gestartet wird und danach der davon abhĂ€ngige Nginx-Container gestartet wird. Als nĂ€chstes leiten wir die Konfiguration fĂŒr unseren Nginx weiter. Es wird etwas niedriger sein und den Ordner mit HTML mounten. Wir stellen außerdem fest, dass der Container gleichzeitig Zugriff auf zwei Netzwerke hat. Es muss sowohl Proxys aus dem Frontend-Netzwerk als auch PHP aus dem Backend-Netzwerk kommunizieren. Im Prinzip wĂ€re es möglich, alle Container in dasselbe Frontend-Netzwerk zu verschieben, aber ich halte daran fest, dass eine solche Trennung korrekter ist.

default.nginx
 server { listen 80; server_name_in_redirect off; access_log /var/log/nginx/host.access.log main; root /var/www/html/; location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } } 


default.nginx ist eine Konfiguration fĂŒr nginx, die an den Container weitergeleitet wird. Der entscheidende Punkt hier ist die PHP- Direktive fastcgi_pass: 9000 . Hiermit wird die Adresse des FastCGI-Servers festgelegt. Die Adresse kann als DomĂ€nenname oder IP-Adresse und Port angegeben werden.

PHP: 9000 - Der Name des Dienstes ist die Adresse des FastCGI-Servers. Nginx, das auf PHP zugreift, erhĂ€lt die IP-Adresse des Containers, in dem PHP ausgefĂŒhrt wird. Port 9000 ist ein Standardport, der beim Erstellen des Basiscontainers deklariert wird. Dieser Port ist fĂŒr nginx ĂŒber das Netzwerk verfĂŒgbar, auf dem Hostcomputer jedoch nicht, da er nicht weitergeleitet wurde.

php


Es ist ungewöhnlich, dass ein Bild nicht angezeigt wird. Stattdessen erstellt es ein eigenes Image direkt aus der Compose-Datei. Die Kontextanweisung verweist auf den Ordner, in dem sich die Docker-Datei befindet.

Dockerfile
 FROM php:7.3.2-fpm RUN apt-get update && apt-get install -y \ libzip-dev \ zip \ && docker-php-ext-configure zip --with-libzip \ && docker-php-ext-install zip \ && docker-php-ext-install mysqli COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html 


Die Docker-Datei gibt an, dass der Build das grundlegende PHP-Image verwendet: 7.3.2-fpm. Anschließend werden die Befehle zum Installieren von PHP-Erweiterungen ausgefĂŒhrt. Als nĂ€chstes wird der Composer von einem anderen Basis-Image kopiert und das Arbeitsverzeichnis fĂŒr das Projekt festgelegt. Ich werde Montageprobleme in anderen BeitrĂ€gen ausfĂŒhrlicher behandeln.

Außerdem werden die Datei php.ini und der HTML-Ordner mit unserem Projekt in den Container geworfen.

Beachten Sie, dass sich PHP im Backend-Netzwerk befindet und der Proxy beispielsweise nicht mehr darauf zugreifen kann.

MySQL


Das Basis-MySQL-Image wird mit dem 5.7-Tag aufgenommen, das fĂŒr die MySQL-Version verantwortlich ist. Der Ordner ./docker/mysql/data wird zum Speichern von Datenbankdateien verwendet (Sie mĂŒssen ihn nicht einmal erstellen, er wird beim Start erstellt). Über die Umgebungsvariablen wird das Kennwort fĂŒr den Root-Benutzer festgelegt, auch fĂŒr root.

Die Datenbank befindet sich im Backend-Netzwerk, so dass sie mit PHP in Kontakt bleiben kann. Das Basis-Image verwendet den Standard-Port 3306. Es ist im Docker-Netzwerk fĂŒr PHP verfĂŒgbar, auf dem Host-Computer jedoch nicht. Wenn Sie fĂŒr diesen Port weiterleiten, können Sie beispielsweise ĂŒber dasselbe PHPSTORM eine Verbindung zu ihm herstellen. Aber wenn Ihnen die phpmyadmin-OberflĂ€che ausreicht, können Sie dies nicht tun.

phpmyadmin


Das offizielle Bild von phpmyadmin. Die Umgebungsvariablen verwenden VIRTUAL_HOST, um mit dem Proxy zu interagieren, Ă€hnlich wie bei nginx. PMA_USER und PMA_PASSWORD greifen auf die Datenbank zu. Und PMA_HOST die Host-Datenbank selbst. Dies ist jedoch nicht localhost, wie es normalerweise der Fall ist, sondern mysql. Das heißt, Die Kommunikation mit der Datenbank erfolgt ĂŒber den Namen ihres Dienstes, d. h. MySQL. Der phpmyadmin-Container kann mit der Datenbank kommunizieren, da er eine Verbindung zum Frontend-Netzwerk hat.

Wir starten die Dienste mit dem ĂŒblichen Befehl: docker-compose -d.

Wir sehen die folgende Ausgabe:

Servicestart
 Creating network "lesson2_backend" with the default driver Building php Step 1/4 : FROM php:7.3.2-fpm ---> 9343626a0f09 Step 2/4 : RUN apt-get update && apt-get install -y libzip-dev zip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && docker-php-ext-install mysqli ---> Using cache ---> 5e4687b5381f Step 3/4 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> Using cache ---> 81b9c665be08 Step 4/4 : WORKDIR /var/www/html ---> Using cache ---> 3fe8397e92e6 Successfully built 3fe8397e92e6 Successfully tagged lesson2_php:latest Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql fc7181108d40: Already exists 787a24c80112: Already exists a08cb039d3cd: Already exists 4f7d35eb5394: Already exists 5aa21f895d95: Already exists a742e211b7a2: Already exists 0163805ad937: Already exists 62d0ebcbfc71: Pull complete 559856d01c93: Pull complete c849d5f46e83: Pull complete f114c210789a: Pull complete Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a Status: Downloaded newer image for mysql:5.7 Creating lesson2_php_1 ... done Creating lesson2_mysql_1 ... done Creating lesson2_phpmyadmin_1 ... done Creating lesson2_nginx_1 ... done 


Wir sehen, dass am Anfang das Lesson2_backend-Netzwerk erstellt wird, dann das PHP-Image zusammengestellt wird, dann Images, die noch nicht im System sind (Pull), heruntergeladen und die beschriebenen Dienste tatsÀchlich gestartet werden können.

Der letzte Schliff, damit alles funktioniert, diese ErgÀnzung zu den Domains hosts oder sites.local und phpmyadmin.local.

Der Inhalt von index.php kann wie folgt sein:

index.php
 <?php //phpinfo(); $link = mysqli_connect('mysql', 'root', 'root'); if (!$link) { die(' : ' . mysqli_error()); } echo ' '; mysqli_close($link); 


Hier ĂŒberprĂŒfen wir, ob die Verbindung der PHP-Erweiterung - mysqli, die wĂ€hrend der Montage der Docker-Datei hinzugefĂŒgt wurde, korrekt ist.

Beachten Sie, dass fĂŒr die Verbindung mit dem Container der Name des Dienstes verwendet wird - mysql.

Die Struktur des gesamten Projekts war wie folgt:

Projektstruktur
 habr/lesson2$ tree . ├── docker │ ├── mysql │ │ └── data │ ├── nginx │ │ └── conf.d │ │ └── default.nginx │ └── php │ ├── Dockerfile │ └── php.ini ├── docker-compose.yml ├── html │ └── index.php └── proxy └── docker-compose.yml 

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


All Articles