Dockers flexible Implementierung zum Aufbau einer PHP-Umgebung

Dockers flexible Implementierung zum Aufbau einer PHP-Umgebung

Verwenden Sie Docker, um eine flexible Online-PHP-Umgebung zu erstellen. Manchmal benötigen Sie einige Pakete oder Bilder nicht, die andere bereits integriert haben.

Mit den folgenden Methoden können wir die benötigte Umgebungsstruktur Stück für Stück aufbauen und schließlich eine automatische Bereitstellung mit nur einem Klick erreichen.

Erleuchten Sie den Docker-Skill-Tree Schritt für Schritt

          ## .
       ## ## ## ==
      ## ## ## ## ## ===
    /""""""""""""""".__/ ===
 ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
    ._____ oder __/
     . .__/
     .___.______/

* Klonen Sie zunächst das Projekt [Server] und legen Sie es im Stammverzeichnis des Servers ab (Sie können später auch Ihre eigene Umgebungsstruktur erstellen).

(Erste Ebene) Verwenden Sie Docker, um nacheinander zu erstellen

1. Laden Sie das Bild herunter

docker pull php:7.2-fpm wählen Sie die Version nach dem Doppelpunkt

Docker-Pull Nginx

docker pull mysql:5.7 erfordert keine lokale Datenbank und kann ignoriert werden

Docker Pull Redis: 3.2 erfordert kein lokales Redis und kann ignoriert werden

Docker-Bilder Alle heruntergeladenen Bilder anzeigen

2. Führen Sie den Container aus, nachdem Sie das Image heruntergeladen haben. [Im Folgenden wird die Methode --link zum Erstellen des Containers verwendet. Beachten Sie die Erstellungsreihenfolge.]

Notiz:
-i ermöglicht uns den Betrieb des Containers
-t gibt ein Terminal im neuen Container an
-d bedeutet, dass der Container im Hintergrund ausgeführt wird
/bin/bash Dadurch wird eine Bash-Shell innerhalb des Containers gestartet.
-p erstellt Portzuordnungen für den Container und den Host
--name gibt einen Namen für den Container an
-v mountet den Pfad im Container in den Hostpfad
--privileged=true erteilt dem Container Berechtigungen. Nach dem Mounten des Verzeichnisses kann der Container auf die Dateien oder Verzeichnisse unter dem Verzeichnis zugreifen.
--link kann zum Verknüpfen zweier Container verwendet werden, sodass der Quellcontainer (der verknüpfte Container) und der empfangende Container (der Container, dessen Verknüpfung aktiv aufgehoben wird) miteinander kommunizieren können, wodurch die Abhängigkeit der Kommunikation zwischen Containern von der Container-IP aufgehoben wird.

<MySQL-Container ausführen>

docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Hinweis: -MYSQL_ROOT_PASSWORD=123456 legt das initiale Passwort für MySQL fest

Wenn Sie keine lokale Datenbank erstellen müssen, fahren Sie mit dem nächsten Schritt fort

<Redis-Container ausführen>

docker run --name myredis -p 6379:6379 -d redis:3.2

Hinweis: Wenn Sie kein lokales Redis erstellen müssen, fahren Sie mit dem nächsten Schritt fort

<PHP-Container ausführen>

docker run -d -p 9000:9000 --name myphp -v /server/www:/var/www/html -v /server/php:/usr/local/etc/php --link mydb:mydb --link myredis:myredis --privileged=true php:7.2-fpm

Hinweis: Wenn Sie keine lokale Datenbank oder Redis erstellen müssen, können Sie --link mydb:mydb --link myredis:myredis weglassen.

Beachten Sie, dass beim Einbinden eines leeren Ordners mit -v der Inhalt des Containers überschrieben wird. Daher muss die Konfigurationsdatei im Voraus vorbereitet werden.

<Nginx-Container ausführen>

docker run --name mynginx -d -p 80:80 -v /server/www:/usr/share/nginx/html -v /server/nginx:/etc/nginx -v /server/logs/nginx.logs:/var/log/nginx --link myphp:myphp --privileged=true nginx

Notiz:

Der Doppelpunkt nach der -v-Anweisung ist der Pfad innerhalb des Containers. Ich habe das Nginx-Webprojektverzeichnis, das Konfigurationsverzeichnis und das Protokollverzeichnis in das zuvor vorbereitete /server-Verzeichnis eingebunden.
--link myphp:myphp verbindet den Nginx-Container und den PHP-Container über den Alias ​​myphp, daher ist es nicht erforderlich, die IP des myphp-Containers anzugeben

docker ps -a um zu sehen, ob alle Container erfolgreich laufen. Die Umgebung ist hier grundsätzlich eingerichtet.

Nach dem Mounten des Verzeichnisses können Sie die Nginx-Konfiguration direkt im entsprechenden gemounteten Verzeichnis ändern, ohne den Container zum Ändern der Konfiguration aufrufen zu müssen.

zu /server/nginx/conf.d/Default.conf

Server {
 hören 80:
 Servername localhost:
 Standort / {
 root /usr/share/nginx/html/blog/public: ##/user/share/nginx/html ist das Arbeitsverzeichnis index index.html index.php index.htm
 }

 Fehlerseite 500 502 503 504 /50x.html
 Standort = /50x.html {
 root /usr/share/nginx/html
 }

 Standort ~\.php$ {
 fastcgi_pass myphp 9000:
   ## Um eine Verbindung zwischen Containern herzustellen, müssen Sie die IP-Adresse der anderen Partei angeben. Verwenden Sie den Befehl sudo docker inspect myphp, um zu überprüfen, ob der IPAddress-Parameter unten die IP-Adresse des Containers ist.
   ##Wir haben den Container mit --link beim Erstellen des Containers erstellt. Wir können das Pseudonym des Link-Containers anstelle der IP verwenden, um darauf zuzugreifen, wodurch die Abhängigkeit von der IP fastcgi_index index.php entfällt
   fastcgi-param SCRIPI_FILENAME /var/www/html/blog/public$fastcgi_script_name:
   ## Die Arbeitsverzeichnisse von myphp und mynginx sind unterschiedlich. Mynginx ist /usr/share/nginx/html
   ## php ist /var/www/html. Beim Erstellen des Containers haben wir daher beide Verzeichnisse im selben Verzeichnis auf dem Host /server/www gemountet, aber das öffentliche Mount-Verzeichnis des Hosts kann hier nicht verwendet werden. include fastcgi_params:
 }
}

3. Installation der PHP-Erweiterungsbibliothek

docker exec -ti myphp /bin/bash zuerst den Container betreten

docker-php-ext-install pdo pdo_mysql Installieren Sie die pdo_mysql-Erweiterung

Docker-PHP-Ext-Redis installieren

Hinweis: Zu diesem Zeitpunkt wird eine Fehlermeldung für redis.so angezeigt, da einige Erweiterungen nicht in der PHP-Quellcodedatei enthalten sind

Methode 1:

tar zxvf /server/php_lib/redis-4.1.0.tgz Entpacken Sie das heruntergeladene Redis-Erweiterungspaket.

docker cp /server/php_lib/redis-4.1.0 myphp:/usr/src/php/ext/redis Fügen Sie die Erweiterung in den Container ein und installieren Sie sie anschließend

Notiz:

Das Platzieren des Erweiterungspakets direkt in das Container-Ext-Verzeichnis kann zu einer Fehlermeldung führen: Kein solcher Container:Pfad: myphp:/usr/src/php/ext
Sie können ein weiteres Serverfenster öffnen, um den PHP-Container aufzurufen und docker-php-ext-install redis auszuführen. Zu diesem Zeitpunkt wird eine Fehlermeldung gemeldet: /usr/src/php/ext/redis existiert nicht
Behalten Sie diesen Zustand bei und führen Sie den vorherigen Befehl in Ihrem ersten Serverfenster aus, um erfolgreich zu sein.
(Der genaue Grund ist unbekannt, aber das Verzeichnis /usr/src/php/ext wird im Container erst geöffnet, nachdem der Befehl docker-php-ext-install einmal ausgeführt wurde.)

Methode 2:

Notiz:

Die offizielle Empfehlung ist, PECL (PHP-Erweiterungsbibliothek-Repository, gepackt über PEAR) zu verwenden. Verwenden Sie pecl install, um die Erweiterung zu installieren, und verwenden Sie dann das offizielle docker-php-ext-enable
Schnelles Skript zum Aktivieren der Erweiterung

pecl installiere Redis und docker-php-ext-enable redis

docker restart myphp Nach der Installation der Erweiterung beenden Sie den Container und starten den Container neu

* Andere Befehle

docker stop $(docker ps -q) stoppt alle Container

docker rm $(docker ps -aq) alle Container löschen

docker rmi $(docker images -q) alle Bilder löschen

Docker Inspect MyPHP, um Containerkonfigurationsinformationen anzuzeigen

* Erstellen Sie Ihre eigene Verzeichnisstruktur

Sie können auch Ihre eigene Server-Verzeichnisstruktur erstellen. Zunächst sollten Sie wissen, dass beim Mounten eines leeren Ordners der gesamte Inhalt des Ordners im Container gelöscht wird. Sie sollten ihn daher zuerst kopieren und dann mounten. Beispiel: Erstellen Sie einen temporären Container sudo docker run --name mynginx -p 80:80 -it -d nginx
Betreten Sie den Container und überprüfen Sie die Verzeichnisadresse der gewünschten Konfigurationsdatei, zum Beispiel: /etc/nginx Verlassen Sie den Container und kopieren Sie die gewünschte Verzeichnisstruktur im Container auf den Host, zum Beispiel: docker cp mydb:/etc/nginx /server/nginx
Wenn Sie den Container löschen und einen neuen Container erstellen, können Sie das Verzeichnis mounten. Danach können Sie die nginx-Konfigurationsdatei direkt auf dem Hostcomputer ändern.
docker run --name mynginx -d -p 80:80 -v /server/nginx:/etc/nginx --link myphp:myphp --privileged=true nginx

(Zweite Bestellung) Docker-Compose automatisierter Build

Nach Abschluss der obigen Schritte verfügen Sie über ein vorläufiges Verständnis der grundlegenden Containervorgänge von Docker.
Docker-Compose wird zum Orchestrieren von Containern verwendet. Sie haben beispielsweise ein PHP-Image, ein MySQL-Image und ein Nginx-Image. Wenn es kein Docker-Compose gibt,
Dann müssen Sie bei jedem Start des Containers die Startparameter jedes Containers, Umgebungsvariablen und Containernamen eingeben, die Verknüpfungsparameter verschiedener Container angeben usw.
Ziemlich umständlich. Nachdem Sie Docker-Composer verwendet haben, können Sie diese Befehle gleichzeitig in die Datei docker-composer.yml schreiben. Jedes Mal, wenn Sie die gesamte Umgebung (einschließlich 3 Container) starten, müssen Sie nur einen Docker-Composer-Up-Befehl eingeben.

1. Installieren Sie Docker-Compose

curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

2. Bereitstellungsumgebung mit nur einem Klick

/server/compose/docker-compose.yml wurde konfiguriert, geben Sie einfach den Befehl ein

cd /server/compose

docker-compose up -d
Version: "2"
Leistungen:
  meine Datenbank:
    Containername: „mydb“
    Häfen:
      - „3306:3306“
    volumes: #Schreiben Sie das gemountete Verzeichnis hier - /server/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:re #Stellen Sie die Zeitsynchronisierung zwischen dem Container und der Hostumgebung ein: # Benutzerdefinierte Umgebungsvariable MYSQL_ROOT_PASSWORD:123456
    images:mysql: 8.0 # Der Container verweist auf das Image myredis:
    Containername: „myredis“
    Neustart: immer
    Häfen:
      - „6379:6379“
    Bände:
      – /server/redis:/daten
      -/usw./Ortszeit:usw./Ortszeit:re
    Bild: redis:3.2
  meinphp:
    Containername: "myphp"
    Neustart: immer
    Häfen:
      - "9000:9000"
    Bände:
      – /server/www:/var/www/html
      -/Server/php:/usr/local/etc/php
      -/etc/Ortszeit:/etc/Ortszeit:re
     Links:
      - "meine Datenbank"
      - "myredis"
     Bild:php:7.2-fpm
   meinnginx:
     Containername: "mynginx"
     Neustart: immer
     Häfen:
       - "80:80"
     Links:
       - "meinphp"
     Bände:
       – /server/www:/usr/share/nginx/html
       – /server/nginx:/etc/nginx
       – /server/logs/nginx.logsL/var/log/nginx
       - /etc/localtime:/etc/localtime:re
     Bild: nginx:latest

Im Vergleich zum obigen Befehl zum Ausführen des Containers sind die Konfigurationsstruktur und Semantik von docker_yml auf einen Blick klar.

(Stufe 3) Docker-Compose und Dockerfile-Komplettbau

Docker-Compose wird verwendet, um eine Ein-Klick-Bedienung zu erreichen, das Problem besteht jedoch darin, dass die PHP-Erweiterungsbibliothek noch separat installiert werden muss, sodass hier Dockerfile benötigt wird, um ein benutzerdefiniertes Container-Image zu erstellen.

Erreichen Sie echte Ein-Klick-Erledigung

Inhaltsverzeichnis:

  Server -|           
     -| Compose.Dockerfiles -| Docker-Compose.yml
                 -| mysql -| Dockerfile Hier legen wir unser benutzerdefiniertes Dockerfile fest, um das MySQL-Image zu erstellen|      
                 -| nginx -| Dockerfile Hier legen wir unser benutzerdefiniertes Dockerfile fest, um das Nginx-Image zu erstellen|     
                 -| php -| Dockerfile Hier legen wir unser benutzerdefiniertes Dockerfile fest, um das PHP-Image zu erstellen|    
                 -| redis -| Dockerfile Hier legen wir unser eigenes Dockerfile fest, um das Redis-Image zu erstellen
FROM php:7.2-fpm #Erstellen Sie ein benutzerdefiniertes Image und importieren Sie das offizielle Image MAINTAINER goozp "Benutzername"
#Stellen Sie die Zeitzone des Containers auf die gleiche Zeitzone wie die des Hosts ein ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtome && echo $TZ > /etc/timezone
#Aktualisieren und installieren Sie abhängige Pakete und PHP-Kernerweiterungen. RUN apt-get update && apt-get install -y \
      libfreetype6-dev \ 
      libhpeg62-turbo-dev \
      libpng-dev \ 
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install - j$(nproc) gd \ 
      && docker-php-ext-install zip \ 
      && docker-php-ext-install pdo_mysql \
      && docker-php-ext-install opcache
      && docker-php-ext-install mysqli
      rm -r /var/lib/apt/lists/*
# Wenn das Quellpaket nicht existiert, verwenden Sie pecl, um die Erweiterung zu installieren. FÜHREN SIE pecl install redis \ aus
  && pecl installiere xdebug \
  && Docker-PHP-Ext-Redis Xdebug aktivieren

ARBEITSVERZEICHNIS /data
#Berechtigungseinstellung RUN usermod -u 1000 www-data

Passen Sie die Docker-Datei von PHP an, um ein benutzerdefiniertes Image zu erstellen und gleichzeitig Erweiterungen zu installieren. Nach Abschluss aller Docker-Dateikonfigurationen muss die Datei Docker-compose.yml nicht mehr das offizielle Image image:php-fpm:7.2 verwenden, sondern direkt build: ./php verwenden, um direkt auf die im Verzeichnis konfigurierte Docker-Datei zu verweisen
Letzter Tipp: Sobald das Image erstellt ist, wird Docker-Compose beim nächsten Mal direkt das vorhandene Image übernehmen, anstatt es zu erstellen. Wenn Sie die Dockerfile-Konfiguration ändern, denken Sie bitte daran, das vorherige Image zu löschen.

cd /server/compose.dockerfiles

docker-compose up -d

Das Obige sind alle Umgebungskonfigurationsmethoden von Docker

* Wenn Sie die Shell verwenden müssen, um PHP für die Ausführung von Skripten auf dem Hostcomputer zu planen

docker exec -it myphp /bin/bash -c '/usr/local/bin/php /var/www/html/blog/public/index.php'

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So konfigurieren Sie die PHP-Entwicklungsumgebung über Docker auf dem Mac
  • Docker-Installation von PHP und Bereitstellungsbeispiel mit Nginx
  • Erläuterung der Schritte zur Installation der PHP-Erweiterung in Docker
  • So verwenden Sie Docker zum Erstellen einer einheitlichen OpenLDAP+phpLDAPadmin-Benutzerauthentifizierung
  • Detaillierte Erläuterung des Tutorials zum Erstellen einer PHP-Umgebung für Docker
  • Detailliertes Tutorial zur Installation des PHP-FPM-Dienstes/der PHP-FPM-Erweiterung/-Konfiguration in Docker
  • So stellen Sie LNMP und phpMyAdmin in Docker bereit
  • PHP verwendet Docker, um Workerman-Fallerklärung auszuführen

<<:  Vuex implementiert einfache Warenkorbfunktion

>>:  Beheben Sie das Problem der Kennwortänderung bei der ersten Anmeldung nach der Installation von MySQL 8.0

Artikel empfehlen

So erstellen Sie Ihren eigenen nativen JavaScript-Router

Inhaltsverzeichnis Vorwort Einführung JavaScript ...

MySQL-Serie 9 MySQL-Abfrage-Cache und -Index

Inhaltsverzeichnis Tutorial-Reihe 1. MySQL-Archit...

Gängige Reparaturmethoden für die Trennung der MySQL Master-Slave-Replikation

Inhaltsverzeichnis 01 Problembeschreibung 02 Lösu...

Vorteile und Nachteile von JSON sowie Einführung in die Verwendung

Inhaltsverzeichnis 1. Was ist JSON 1.1 Array-Lite...

So verwalten Sie mehrere Projekte auf dem CentOS SVN-Server

Eine Forderung Im Allgemeinen hat ein Unternehmen...

Vue-Anfängerhandbuch: Umgebungserstellung und Erste Schritte

Inhaltsverzeichnis Erster Blick Erstellen einer V...

So implementieren Sie das Beobachtermuster in JavaScript

Inhaltsverzeichnis Überblick Anwendungsszenarien ...

Bedingtes Rendering von Vue (v-if und v-show)

Inhaltsverzeichnis 1. v-wenn 2. Verwenden Sie v-i...

Drei gängige Möglichkeiten zum Einbetten von CSS in HTML-Dokumente

Die folgenden drei Methoden werden häufig verwende...

CSS-Rand halb oder teilweise sichtbarer Implementierungscode

1. Verwenden Sie Pseudoklassen, um die Hälfte des...

Beispiel für die MySQL-Methode zum Löschen von Daten und Datentabellen

Es ist sehr einfach, Daten und Tabellen in MySQL ...