Der LAMP-Stack
LAMP ist der Software-Stack, auf dem wohl die meisten Websites laufen. Linux stellt die Grundlage des Stacks dar, und die traditionelle Implementierung umfasst Apache als Webserver, die MySQL-Datenbank und PHP als serverseitige Programmiersprache. Es gibt jedoch viele mögliche Variationen:MariaDB wird beispielsweise häufig anstelle von MySQL verwendet, von dem es ein Fork ist, und andere Programmiersprachen, wie Python oder Perl können anstelle von PHP verwendet werden. In diesem Artikel werden wir sehen, wie man einen einfachen LAMP-Stack mit Docker und dem Dienstprogramm docker-compose implementiert.
In diesem Tutorial lernen Sie:
- So installieren Sie Docker und Docker-Compose unter Ubuntu 20.04
- So definieren Sie Dienste und Volumes mit Docker-Compose
- So ordnen Sie Host-Ports Container-Ports in der docker-compose-Konfigurationsdatei zu
- Verwendung von Bind-Mounts und benannten Volumes
- So erstellen Sie ein Projekt mit docker-compose
Softwareanforderungen und verwendete Konventionen
Kategorie | Anforderungen, Konventionen oder verwendete Softwareversion |
---|---|
System | Ubuntu 20.04 installiert oder Ubuntu auf 20.04 Focal Fossa aktualisiert |
Software | docker, docker-compose |
Andere | Root-Berechtigungen zum Erstellen von Docker-Containern und Starten des Docker-Dienstes |
Konventionen | # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden |
-
Pakete installieren und Docker-Dienst starten
Um einen Docker-basierten LAMP-Stack auf Ubuntu 20.04 Focal Fossa zu erstellen, müssen wir zunächst die benötigte Software installieren:
docker
selbst unddocker-compose
, ein Dienstprogramm, mit dem wir mithilfe vonyaml
ganz einfach Multi-Container-Anwendungen organisieren können Konfigurationsdateien. Beide Pakete sind in den offiziellen Repositories von Ubuntu verfügbar. Wir können sie überapt
installieren :$ sudo apt install docker docker-compose
Nachdem die Installation durchgeführt wurde, müssen wir den
docker
starten service und aktivieren Sie ihn beim Booten. Wir können beide Operationen mit einem einzigen Befehl ausführen:$ systemctl enable --now docker
-
Projekteinrichtung
Der erste Schritt auf unserer Reise besteht in der Erstellung des Verzeichnisses, das wir als Wurzel unseres Projekts verwenden werden. Für diesen Artikel nennen wir es
linuxconfig
. Innerhalb dieses Verzeichnisses erstellen wir ein weiteres,DocumentRoot
, die unsere Website-Dateien hosten wird. Wir können beide Verzeichnisse auf einmal mit dem-p
erstellen Option desmkdir
Befehl:$ mkdir -p linuxconfig/DocumentRoot
Innerhalb der
linuxconfig
Verzeichnis definieren wir die docker-compose-Konfiguration für unser Projekt in einer yaml-Datei, die standardmäßigdocker-compose.yml
heißen sollte . Es gibt drei Hauptabschnitte, die wir in der Konfigurationsdatei verwenden können:services , Volumen und Netzwerke .Jeder Abschnitt wird verwendet, um den entsprechenden Aspekt eines Projekts zu konfigurieren. In diesem Tutorial verwenden wir nur die ersten beiden. Wir werden die Komponenten des LAMP-Stacks als Dienste in ihren eigenen separaten Containern implementieren.
Die mit docker-compose erstellten Container sind Mitglieder desselben Netzwerks und können daher standardmäßig miteinander kommunizieren. Im Netzwerk kann jeder Container die anderen über einen Hostnamen referenzieren, der mit ihrem Namen identisch ist, oder über den Namen, der zur Definition des vom Container implementierten Dienstes verwendet wird.
Standardmäßig werden Container mit dem Namen des Verzeichnisses benannt, das die Konfigurationsdatei als Präfix enthält. In diesem Fall zum Beispiel der Container, der für einen Dienst namens php-httpd verwendet wird , wird linuxconfig_php-httpd_1 genannt .
-
Definieren des php + httpd-Dienstes
Der erste Dienst, den wir in der Konfigurationsdatei definieren, wird PHP enthalten als das Apache-Webservermodul. Wir werden eines der offiziellen PHP-Images verwenden, die auf dockerhub verfügbar sind als Basis für unseren Container, speziell den mit dem
-apache
Suffix, das das oben erwähnte Setup bereitstellt. Beginnen wir mit dem Schreiben unserer Konfiguration:version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html"
Das erste, was wir in der Konfigurationsdatei angegeben haben, ist
version
. Mit dieser Anweisung geben wir an, welche spezifische Version der Compose-Datei wir verwenden werden. Zum Zeitpunkt des Schreibens Version3.7
ist die neueste und empfohlene. - Nachdem wir die Compose-Dateiversion deklariert hatten, begannen wir mit dem Schreiben des Dienstes Strophe; Darin definieren wir die Dienste, die unseren LAMP-Stack bilden. Wir haben den ersten Dienst
php-httpd
genannt . Der Dienstname ist völlig willkürlich, aber es ist immer eine gute Angewohnheit, einen im Kontext des Projekts aussagekräftigen Namen zu verwenden.Das
image
Instruktion wird verwendet, um anzugeben, auf welchem Image der Container basieren soll, in diesem Fallphp:7.3-apache
.Die
ports
Die Anweisung wird verwendet, um Ports auf dem Container verfügbar zu machen und eine Zuordnung zwischen Host-Ports und Container-Ports zu erstellen. Eine solche Karte wird definiert, indem die Ports mit einem:
getrennt werden . Auf der linken Seite geben wir den Host-Port an und auf der rechten Seite den Port innerhalb des Containers, dem er zugeordnet werden soll. In diesem Fall haben wir Port80
zugeordnet auf dem Host auf Port80
auf dem Container, da dies der vom Apache-Webserver verwendete Standardport ist.Die letzte Anweisung, die wir verwendet haben, ist
volumes
:Damit können wir eine Zuordnung zwischen einem benannten Volume angeben oder ein Pfad (relativ oder absolut) auf dem Hostsystem zu einem Pfad auf dem Container, auf dem es gemountet wird.In unserem Setup ist die Datei
./DocumentRoot
Das Verzeichnis hostet die Site-Dateien:Es wird auf/var/www/html
gemountet -Verzeichnis innerhalb des Containers, da letzteres das Dokumentenstammverzeichnis ist, das vom Standard-Apache VirtualHost verwendet wird. Eine solche Einrichtung wird als bind mount bezeichnet und ist besonders nützlich während der Entwicklung, da die Änderungen, die wir an den Projektdateien vornehmen, sofort im Container widergespiegelt werden. Der Nachteil dieser Konfiguration besteht darin, dass sie eine Abhängigkeit zwischen dem Container und der Dateistruktur des Hostcomputers herstellt, wodurch einer der Hauptvorteile der Verwendung von Docker verringert wird:die Portabilität.Das Verzeichnis, das innerhalb des Containers gemountet werden soll, wird automatisch erstellt, wenn es beim
docker-compose up
nicht vorhanden ist Befehl gestartet:In diesem Fall gehört er root, wenn nicht anders angegeben.Innerhalb des
DocumentRoot
Verzeichnis können wir jetzt eine Indexdatei erstellen und versuchen, unser Projekt zu erstellen, um zu überprüfen, ob das Setup funktioniert:$ echo "<?php phpinfo();" > DocumentRoot/index.php $ sudo docker-compose up -d
Nach dem Ausführen des Befehls werden die benötigten Docker-Images von Dockerhub heruntergeladen und die Container werden mit den von uns bereitgestellten Einstellungen erstellt und im Hintergrund ausgeführt (sie blockieren das Terminal nicht), da
-d
Option, die wir fürdocker-compose
bereitgestellt haben Befehl. Wenn das Projekt läuft und läuft, navigieren wir zulocalhost
mit unserem Browser sollten wir die folgende Seite sehen:
Die phpinfo-SeiteUm das Projekt zu stoppen, aus dem Verzeichnis, in dem sich
docker-compose.yml
befindet Datei können wir ausführen:$ sudo docker-compose stop
Den MariaDB-Dienst definieren
Ein wesentlicher Bestandteil des LAMP-Stacks ist die Datenbankschicht. In unserer Konfiguration verwenden wir MariaDB und sein offizielles Docker-Image auf Dockerhub verfügbar:
version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" mariadb: image: mariadb:10.5.2 volumes: - mariadb-volume:/var/lib/mysql environment: TZ: "Europe/Rome" MYSQL_ALLOW_EMPTY_PASSWORD: "no" MYSQL_ROOT_PASSWORD: "rootpwd" MYSQL_USER: 'testuser' MYSQL_PASSWORD: 'testpassword' MYSQL_DATABASE: 'testdb' volumes: mariadb-volume:
Innerhalb der Dienste Strophe haben wir einen weiteren Dienst definiert und nennen ihn
mariadb
und mit demimage
Anweisung haben wir angegeben, dass wir10.5.2
verwenden möchten Version des offiziellen Bildes.In der vorherigen Service-Definition haben wir ein Bind-Mount verwendet. Dieses Mal haben wir stattdessen ein richtiges Docker-benanntes Volume verwendet , zum Einhängen unter
/var/lib/mysql
innerhalb des Containers (es ist das von MariaDB verwendete Standarddatenverzeichnis). Im Gegensatz zu einem Bind-Mount erstellen benannte Volumes keine Abhängigkeiten des Containers von der Host-Dateisystemstruktur. Sie werden vollständig von Docker verwaltet und sind die empfohlene Methode, um Daten zu speichern, die ansonsten verloren gehen würden, wenn Container zerstört werden.Benannte Volumes können in den Haupt-
volumes
definiert werden Strophe der Konfigurationsdatei und kann von denvolumes
referenziert werden Unterabschnitt der einzelnen definierten Dienste. In diesem Fall haben wir unser Volumemariadb-volume
genannt .Als nächsten Schritt haben wir den Wert einiger Umgebungsvariablen definiert verwendet, um das Containerverhalten zu beeinflussen. Umgebungsvariablen werden in
environment
definiert Abschnitt einer Dienstdefinition. Die von uns definierten Variablen haben in diesem Fall folgende Wirkung:Variable Effekt TZ Stellen Sie die vom MariaDB-Server verwendete Zeitzone ein MYSQL_ALLOW_EMPTY_PASSWORD Aktivieren oder deaktivieren Sie die Verwendung eines leeren Passworts für den db-Root-Benutzer MYSQL_ROOT_PASSWORD Dies ist eine obligatorische Variable und wird verwendet, um das Kennwort des DB-Root-Benutzers festzulegen MYSQL_DATABASE Optional verwendet, um den Namen der Datenbank anzugeben, die beim Starten des Images erstellt werden soll MYSQL_USER Optional verwendet, um den Namen eines Benutzers anzugeben, der mit Superuser-Berechtigungen für die mit MYSQL_DATABASE angegebene Datenbank erstellt wird MYSQL_PASSWORT Wird verwendet, um das Passwort für den Benutzer anzugeben, der mit dem von MYSQL_USER bereitgestellten Namen erstellt wurde An diesem Punkt sollten wir einen funktionierenden Webserver haben, der mit PHP arbeiten kann, und eine Datenbank, um unsere Daten zu speichern.
Bonus – phpMyAdmin
Unser grundlegender LAMP-Stack sollte nun vollständig sein. Als Bonus möchten wir vielleicht phpMyAdmin hinzufügen dazu, um unsere MariaDB-Datenbank einfach über eine benutzerfreundliche Weboberfläche zu steuern. Lassen Sie uns die zugehörige Dienstdefinition zu unserer docker-compose-Konfiguration hinzufügen:
version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" mariadb: image: mariadb:10.5.2 volumes: - mariadb-volume:/var/lib/mysql environment: TZ: "Europe/Rome" MYSQL_ALLOW_EMPTY_PASSWORD: "no" MYSQL_ROOT_PASSWORD: "rootpwd" MYSQL_USER: 'testuser' MYSQL_PASSWORD: 'testpassword' MYSQL_DATABASE: 'testdb' phpmyadmin: image: phpmyadmin/phpmyadmin links: - 'mariadb:db' ports: - 8081:80 volumes: mariadb-volume:
Wir haben unseren Dienst
phpmyadmin
genannt und es so konfiguriert, dass es phpmyadmin/phpmyadmin verwendet Bild von dockerhub. Wir haben auch dielinks
verwendet Schlüsselwort zum ersten Mal; wofür ist das? Wie wir bereits wissen, können alle Container, die in derselben Docker-Compose-Konfiguration erstellt wurden, standardmäßig und ohne dass spezielle Konfigurationen erforderlich sind, miteinander kommunizieren. Das phpMyAdmin-Image ist so konfiguriert, dass es durchdb
auf einen laufenden Datenbankcontainer verweist name, daher müssen wir einen Alias mit demselben Namen für unseren mariadb-Dienst erstellen. Das ist genau das, waslinks
wird verwendet für:um zusätzliche Aliase zu definieren, um einen Dienst von einem anderen aus zu erreichen.Innerhalb der Dienstdefinition haben wir auch Port
8081
zugeordnet unseres Host-Rechners an Port80
innerhalb des Containers (Port 80 ist bereits demselben Port innerhalb des php-httpd-Containers zugeordnet). Die phpMyAdmin-Oberfläche ist daher unter localhost:8081 erreichbar die Anschrift. Lassen Sie uns unser Projekt neu erstellen und überprüfen:$ sudo docker-compose up -d --build
Die Anmeldeseite von PhpMyAdminWir können uns mit den Anmeldeinformationen anmelden, die wir für unseren Datenbankdienst definiert haben, und überprüfen, ob die Datei
testdb
Datenbank wurde erstellt:
PhpMyAdmin-HomepageEin benutzerdefiniertes Image für einen Dienst verwenden
In den obigen Beispielen haben wir in unserer Dienstdefinition immer Vanilla-Images verwendet. Es gibt Fälle, in denen wir darauf basierende benutzerdefinierte Docker-Images verwenden möchten. Angenommen, wir möchten den Dienst php-httpd erstellen, aber eine zusätzliche PHP-Erweiterung hinzufügen:Wie können wir das tun? Im Stammverzeichnis des Projekts definieren wir ein neues Verzeichnis und benennen es der Einfachheit halber nach dem Dienst:
$ mkdir php-httpd
In diesem Verzeichnis erstellen wir ein Dockerfile, das zum Erweitern des Basisimages verwendet wird, mit folgendem Inhalt:
FROM php:7.3-apache LABEL maintainer="[email protected]" RUN apt-get update && apt-get install -y libmcrypt-dev \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-enable mcrypt
Zurück in unserer
docker-compose.yml
-Datei ändern wir die Definition desphp-httpd
Service. Wir können das Bild nicht wie zuvor direkt referenzieren. Stattdessen geben wir das Verzeichnis mit unserem benutzerdefinierten Dockerfile als Build-Kontext an:version: '3.7' services: php-httpd: build: context: ./php-httpd ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" [...]
Im
build
Abschnitt definieren wir Konfigurationen, die zur Build-Zeit angewendet werden. In diesem Fall haben wircontext
verwendet um auf das Verzeichnis zu verweisen, das das Dockerfile enthält:Dieses Verzeichnis wird als Build-Kontext verwendet, und sein Inhalt wird an den Docker-Daemon gesendet, wenn der Container erstellt wird. Um die Änderung anzuwenden, müssen wir das Projekt neu erstellen.Übrigens, um mehr über zusätzliche Erweiterungen im PHP-Docker-Image zu erfahren, können Sie sich die offizielle Dokumentation und insbesondere die PECL-Erweiterungen ansehen Abschnitt.
Schlussfolgerungen
In diesem Tutorial haben wir gesehen, wie man einen einfachen LAMP-Stack mithilfe der Container-Technologie mit Docker und docker-compose erstellt. Wir haben gesehen, wie die verschiedenen Dienste in der Konfigurationsdatei docker-compose.yml definiert werden und wie Bind-Mounts, benannte Volumes und die Zuordnung von Host-Container-Ports konfiguriert werden. Wir haben auch gesehen, wie man benutzerdefinierte Bilder verwendet. In der Docker-Compose-Referenz finden Sie eine detaillierte Liste der Anweisungen, die in der Docker-Compose-Konfigurationsdatei verwendet werden können.