Wie man Wordpress und PhpMyAdmin mit Docker Compose auf Ubuntu 14.04 installiert
Einführung
Docker Compose macht den Umgang mit den Orchestrierungsprozessen von Docker-Containern (wie dem Starten, Herunterfahren und Einrichten von Verbindungen und Volumes zwischen Containern) wirklich einfach.
Dieser Artikel bietet ein praxisnahes Beispiel für die Verwendung von Docker Compose zur Installation einer Anwendung, in diesem Fall WordPress mit PHPMyAdmin als Zusatz. WordPress läuft normalerweise auf einem LAMP-Stack, was Linux, Apache, MySQL/MariaDB und PHP bedeutet. Das offizielle WordPress-Docker-Image enthält Apache und PHP für uns, sodass wir uns nur um MariaDB kümmern müssen.
Voraussetzungen
Um diesem Artikel zu folgen, benötigen Sie Folgendes:
- Ubuntu 14.04 Tropfen
- Ein Nicht-Root-Benutzer mit Sudo-Rechten (Die Anleitung zur Ersteinrichtung des Servers mit Ubuntu 14.04 erklärt, wie man dies einrichtet.)
- Docker und Docker Compose gemäß den Anweisungen in "Wie man Docker Compose auf Ubuntu 14.04 installiert und verwendet" installiert.
Schritt 1 — WordPress installieren
Wir werden die offiziellen WordPress- und MariaDB-Docker-Images verwenden. Wenn Sie neugierig sind, gibt es viele weitere Informationen zu diesen Images und ihren Konfigurationsoptionen auf ihren jeweiligen GitHub- und Docker Hub-Seiten.
Lass uns damit beginnen, einen Ordner zu erstellen, in dem unsere Daten gespeichert werden, und eine minimale docker-compose.yml-Datei zu erstellen, um unseren WordPress-Container auszuführen:
mkdir ~/wordpress && cd $_
Erstelle dann eine ~/wordpress/docker-compose.yml mit deinem bevorzugten Texteditor (nano ist einfach, wenn du keine Präferenz hast):
- nano ~/wordpress/docker-compose.yml
und fügen Sie Folgendes ein:
wordpress:
image: wordpress
Dies weist Docker Compose lediglich an, einen neuen Container mit dem Namen wordpress zu starten und das wordpress Image vom Docker Hub herunterzuladen.
Wir können das Bild so hochladen:
- docker-compose up
Sie werden sehen, wie Docker das WordPress-Image aus dem Docker Hub herunterlädt und extrahiert, und nach einiger Zeit erhalten Sie einige Fehlermeldungen, die ähnlich wie die folgenden sind:
wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables
wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db
wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port?
dockercompose_wordpress_1 exited with code 1
Dies ist WordPress, das sich beschwert, dass es eine Datenbank nicht finden kann. Lassen Sie uns ein MariaDB-Image hinzufügen und es verlinken, um das zu beheben.
Schritt 2 — Installation von MariaDB
Um das MariaDB-Bild zur Gruppe hinzuzufügen, öffnen Sie docker-compose.yml erneut mit Ihrem Texteditor:
nano ~/wordpress/docker-compose.yml
Ändern Sie die docker-compose.yml, um dem Folgenden zu entsprechen (achten Sie auf die Einrückung, YAML-Dateien sind empfindlich gegenüber Leerzeichen).
wordpress:
image: wordpress
links:
- wordpress_db:mysql
wordpress_db:
image: mariadb
Was wir hier gemacht haben, ist, einen neuen Container namens wordpress_db zu definieren und ihm gesagt, dass er das mariadb Image aus dem Docker Hub verwenden soll. Wir haben auch unserem wordpress Container gesagt, dass er unseren wordpress_db Container in den wordpress Container verlinken und ihn mysql nennen soll (innerhalb des wordpress Containers wird der Hostname mysql an unseren wordpress_db Container weitergeleitet).
Wenn Sie docker-compose up erneut ausführen, werden Sie sehen, dass das MariaDB-Image heruntergeladen wird, und Sie werden auch sehen, dass wir noch nicht ganz dort sind:
wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable
wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ?
wordpress_1 |
wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.)
wordpress_wordpress_db_1 exited with code 1
wordpress_wordpress_1 exited with code 1
Gracefully stopping... (press Ctrl+C again to force)
WordPress beschwert sich weiterhin darüber, dass es keine Datenbank finden kann, und jetzt haben wir eine neue Beschwerde von MariaDB, dass kein Root-Passwort gesetzt ist.
Es scheint, dass das bloße Verbinden der beiden Container nicht ganz ausreicht. Lassen Sie uns die Variable MYSQL_ROOT_PASSWORD festlegen, damit wir dieses Ding tatsächlich starten können.
Bearbeite die Docker Compose-Datei erneut:
- nano ~/wordpress/docker-compose.yml
Fügen Sie diese beiden Zeilen am Ende des wordpress_db-Bereichs hinzu, aber stellen Sie sicher, dass Sie examplepass in ein sichereres Passwort ändern!
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
Dies wird eine Umgebungsvariable im wordpress_db-Container mit dem Namen MYSQL_ROOT_PASSWORD setzen, die dein gewünschtes Passwort enthält. Das MariaDB-Docker-Image ist so konfiguriert, dass es beim Start nach dieser Umgebungsvariable sucht und sich um die Einrichtung der Datenbank mit einem root-Konto kümmert, dessen Passwort als MYSQL_ROOT_PASSWORD definiert ist.
Während wir dabei sind, lassen Sie uns auch eine Portweiterleitung einrichten, damit wir uns mit unserer WordPress-Installation verbinden können, sobald sie tatsächlich geladen ist. Fügen Sie im wordpress-Abschnitt diese beiden Zeilen hinzu:
wordpress:
...
ports:
- 8080:80
...
Die erste Portnummer ist die Portnummer des Hosts, und die zweite Portnummer ist der Port innerhalb des Containers. Diese Konfiguration leitet also Anfragen vom Port 8080 des Hosts zum Standard-Webserverport 80 innerhalb des Containers weiter.
Hinweis: Wenn Sie möchten, dass Wordpress auf dem Standard-Webserver-Port 80 auf dem Host ausgeführt wird, ändern Sie die vorherige Zeile in 80:80, damit Anfragen an Port 80 auf dem Host an Port 80 innerhalb des Wordpress-Containers weitergeleitet werden.
Ihre vollständige docker-compose.yml Datei sollte jetzt so aussehen:
wordpress:
image: wordpress
links:
- wordpress_db:mysql
ports:
- 8080:80
wordpress_db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: examplepass
Mit dieser Konfiguration können wir tatsächlich WordPress starten. Lassen Sie es uns diesmal mit der -d Option ausführen, die docker-compose anweist, die Container im Hintergrund zu starten, damit Sie Ihr Terminal weiterhin verwenden können:
- docker-compose up -d
Sie werden eine ganze Menge Texte auf Ihrem Bildschirm vorbeifliegen sehen. Sobald es sich beruhigt hat, öffnen Sie einen Webbrowser und navigieren Sie zur IP Ihrer DigitalOcean-Box auf Port 8080 (zum Beispiel, wenn die IP-Adresse Ihres Servers 123.456.789.123 ist, sollten Sie http://123.456.789.123:8080 in Ihren Browser eingeben.)
Sie sollten eine frische WordPress-Installationsseite sehen und in der Lage sein, die Installation wie gewohnt abzuschließen und zu bloggen.
Da dies beides offizielle Docker-Images sind und alle Best Practices von Docker befolgen, haben jedes dieser Images vordefinierte, persistente Volumes für Sie - was bedeutet, dass Ihre Blogbeiträge auch nach einem Neustart des Containers noch vorhanden sind. Sie können mehr über die Arbeit mit Docker-Volumes im Docker-Tutorial zu Datenvolumes erfahren.
Schritt 3 — Hinzufügen eines PhpMyAdmin-Containers
Großartig, das war relativ schmerzfrei. Lassen Sie uns versuchen, ein wenig schick zu werden.
Bisher haben wir nur offizielle Images verwendet, um die sich das Docker-Team große Mühe gibt, um sicherzustellen, dass sie genau sind. Möglicherweise ist Ihnen aufgefallen, dass wir dem WordPress-Container keine Umgebungsvariablen zur Konfiguration geben mussten. Sobald wir ihn mit einem richtig konfigurierten MariaDB-Container verbunden haben, hat alles funktioniert.
Dies liegt daran, dass es ein Skript im WordPress-Docker-Container gibt, das tatsächlich die Variable MYSQL_ROOT_PASSWORD aus unserem wordpress_db-Container abruft und diese verwendet, um eine Verbindung zu WordPress herzustellen.
Lass uns ein wenig außerhalb des offiziellen Bildbereichs gehen und ein von der Community beigetragenes PhpMyAdmin-Bild verwenden. Bearbeite docker-compose.yml ein weiteres Mal:
- nano docker-compose.yml
Fügen Sie Folgendes am Ende der Datei ein:
phpmyadmin:
image: corbinu/docker-phpmyadmin
links:
- wordpress_db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: examplepass
Stellen Sie sicher, dass Sie examplepass durch dasselbe Root-Passwort aus dem wordpress_db Container ersetzen, den Sie zuvor eingerichtet haben.
Dies greift docker-phpmyadmin von Community-Mitglied corbinu, verbindet es mit unserem wordpress_db Container unter dem Namen mysql (was bedeutet, dass von innerhalb des phpmyadmin Containers Verweise auf den Hostnamen mysql an unseren wordpress_db Container weitergeleitet werden), macht seinen Port 80 auf Port 8181 des Host-Systems zugänglich und setzt schließlich ein paar Umgebungsvariablen mit unserem MariaDB-Benutzernamen und Passwort. Dieses Image greift die Umgebungsvariable MYSQL_ROOT_PASSWORD nicht automatisch aus der Umgebung des wordpress_db Containers, wie es das wordpress Image tut. Wir müssen tatsächlich die Zeile MYSQL_ROOT_PASSWORD: examplepass aus dem wordpress_db Container kopieren und den Benutzernamen auf root setzen.
Die vollständige docker-compose.yml Datei sollte jetzt so aussehen:
wordpress:
image: wordpress
links:
- wordpress_db:mysql
ports:
- 8080:80
wordpress_db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: examplepass
phpmyadmin:
image: corbinu/docker-phpmyadmin
links:
- wordpress_db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: examplepass
Nun starten Sie die Anwendungsgruppe erneut:
- docker-compose up -d
Sie werden sehen, wie PhpMyAdmin installiert wird. Sobald es fertig ist, besuchen Sie erneut die IP-Adresse Ihres Servers (diesmal unter Verwendung des Ports 8181, z.B. http://123.456.789.123:8181). Sie werden von dem Anmeldebildschirm von PhpMyAdmin empfangen.
Melden Sie sich mit dem Benutzernamen root und dem Passwort, das Sie in der YAML-Datei festgelegt haben, an, und Sie können Ihre Datenbank durchsuchen. Sie werden feststellen, dass der Server eine wordpress-Datenbank enthält, die alle Daten Ihrer WordPress-Installation enthält.
Sie können auf diese Weise so viele Container hinzufügen, wie Sie möchten, und sie auf beliebige Weise miteinander verlinken. Wie Sie sehen können, ist der Ansatz ziemlich leistungsfähig - anstatt sich mit der Konfiguration und den Voraussetzungen für jedes einzelne Modul auseinanderzusetzen und sie alle auf demselben Server einzurichten, können Sie die Teile wie Lego-Blocks zusammenstecken und Komponenten nach und nach hinzufügen. Mit Tools wie Docker Swarm können Sie sogar diese Container transparent über mehrere Server hinweg ausführen! Das fällt jedoch ein wenig außerhalb des Rahmens dieses Tutorials. Docker bietet dazu einige Dokumentationen an, wenn Sie interessiert sind.
Schritt 4 — Erstellung der WordPress-Website
Da alle Dateien für Ihre neue WordPress-Website in Ihrem Docker-Container gespeichert sind, was passiert mit Ihren Dateien, wenn Sie den Container stoppen und ihn wieder starten?
Standardmäßig ist das Dokumentenstammverzeichnis für den WordPress-Container persistent. Dies liegt daran, dass das WordPress-Image aus dem Docker Hub so konfiguriert ist. Wenn Sie eine Änderung an Ihrer WordPress-Website vornehmen, die Anwendungsgruppe stoppen und sie erneut starten, werden Ihre Website weiterhin die Änderungen haben, die Sie vorgenommen haben.
Lass es uns versuchen.
Gehe über einen Webbrowser (z.B. http://123.456.789.123:8080) zu deinem WordPress. Bearbeite den bereits vorhandenen Hello World! Beitrag. Stoppe dann alle Docker-Container mit folgendem Befehl:
- docker-compose stop
Versuchen Sie, die WordPress-Website erneut zu laden. Sie werden sehen, dass die Website nicht erreichbar ist. Starten Sie die Docker-Container erneut:
- docker-compose up -d
Lade erneut die WordPress-Seite. Du solltest deine Blog-Seite und die Änderungen sehen, die du zuvor vorgenommen hast. Das zeigt, dass die Änderungen, die du vornimmst, auch gespeichert werden, wenn die Container gestoppt sind.
Schritt 5 — Speichern des Dokumentenstamms im Host-Dateisystem (Optional)
Es ist möglich, das Dokumenten-Wurzelverzeichnis für WordPress auf dem Host-Dateisystem zu speichern, indem man ein Docker-Datenvolume verwendet, um Dateien zwischen dem Host und dem Container zu teilen.
Hinweis: Für weitere Informationen zur Arbeit mit Docker-Datenvolumes werfen Sie einen Blick auf das Tutorial zu Docker-Datenvolumes.
Lass es uns versuchen. Öffne deine docker-compose.yml Datei noch einmal:
nano ~/wordpress/docker-compose.yml
Fügen Sie im wordpress: Abschnitt die folgenden Zeilen hinzu:
wordpress:
...
volumes:
- ~/wordpress/wp_html:/var/www/html
...
Stoppen Sie Ihre derzeit laufende docker-compose Sitzung:
- docker-compose stop
Entfernen Sie den vorhandenen Container, damit wir das Volume mit dem Host-Dateisystem verknüpfen können:
- docker-compose rm wordpress
Starte WordPress erneut:
- docker-compose -d
Sobald die Eingabeaufforderung zurückkehrt, sollte WordPress wieder betriebsbereit sein - diesmal mit dem Host-Dateisystem, um das Dokumentenverzeichnis zu speichern.
Wenn Sie in Ihrem ~/wordpress Verzeichnis nachsehen, werden Sie feststellen, dass es jetzt ein wp_html Verzeichnis darin gibt:
- ls ~/wordpress
Alle WordPress-Quelldateien befinden sich darin. Änderungen, die Sie vornehmen, werden in Echtzeit vom WordPress-Container erfasst.
Diese Erfahrung war ein bisschen reibungsloser als gewöhnlich – der WordPress-Docker-Container ist so konfiguriert, dass er überprüft, ob /var/www/html leer ist oder nicht, wenn er startet, und die Dateien entsprechend dorthin kopiert. Normalerweise müssen Sie diesen Schritt selbst durchführen.
Schlussfolgerung
Sie sollten ein vollständiges WordPress-Deployment am Laufen haben. Sie sollten in der Lage sein, dieselbe Methode zu verwenden, um eine Vielzahl von Systemen mit den im Docker Hub verfügbaren Images bereitzustellen. Stellen Sie sicher, herauszufinden, welche Volumes persistent sind und welche nicht für jeden Container, den Sie erstellen.
Frohes Docken!