Applikationen wie beispielsweise WordPress werden vorinstalliert und vorkonfiguriert in Docker Images geliefert. In der Regel möchte man solche Images aber vor der Verwendung auf die eigenen spezifischen Bedürfnisse anpassen. Auch so etwas ist mit Docker möglich. In diesem Blogbeitrag werden wir das bestehende Docker Image für WordPress anpassen, indem wir wp-cli (http://wp-cli.org/de/) hinzufügen. wp-cli ist ein Kommandozeilen-Interface für WordPress mit dem man das System über die Kommandozeile konfigurieren kann.
Eine angepasste Version des WordPress Images kann man mit dem folgenden dockerfile erzeugen.
Hier wird zunächst auf das neuste WordPress Image referenziert. Dann werden über RUN verschiedene Befehle innerhalb des Containers ausgeführt. Im Einzelnen sind dies
apt-get update apt-get install -y sudo less mysql-client curl -o /bin/wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
Die erste Zeile aktualisiert die Liste der Paket im Paketmanager. Die zweite Zeile installiert den mysql-client und die dritte Zeile holt die Datei wp-cli.phar von der angegebenen URL.
Nachdem diese Vorbereitungen getroffen wurden ist es nun an der Zeit mit dem Befehl
COPY wp /bin/wp
unsere Wrapper-Datei aus dem lokalen Verzeichnis auf unserem PC in den Container zu kopieren. Die Wrapper-Datei ist recht einfach aufgebaut. Es handelt sich einfach um eine Datei in der der wirkliche Befehl steht den wir eingeben müssten um mit wp-cli zu arbeiten. Da das ziemlich umfangreich ist packen wir diesen Befehl in eine Wrapper-Datei die dann einfach über wp aufgerufen wird.
Die nächste Zeile führt dann über RUN innerhalb des Containers die Befehle
chmod 755 /bin/wp-cli.phar /bin/wp sed -i -e ‘s/\r$//‘ /bin/wp
aus. Der erste Befehl ändert die Ausführungseinstellungen für die Dateien wp-cli.phar und wp, damit diese als Scripte ausgeführt werden können. Die zweite Zeile ist eine spezielle Zeile die wir benötigen um die Linefeeds in der Datei zu korrigieren. Im Beispiel habe ich die Script-Datei wp mit Visual Studio Code unter Windows erstellt und daher haben wir Windows Carriage Return / Line Feeds in der Datei. Das führt dazu, dass die Datei nicht richtig unter Ubuntu funktioniert. Wurde die Datei auf einem Linux-Rechner erstellt ist dieser Schritt natürlich nicht notwendig. sed ist der streaming editor (https://wiki.ubuntuusers.de/sed/) mit dem wir einfach eine Zeichenersetzung in der Datei wp machen.
Um aus diesem dockerfile eine Image zu bauen gehen wir wie folgt vor:
1.) Wir wechseln in das Verzeichnis in dem sich die Dateien befinden und geben dort den Befehl
docker image build -t wordpress-custom
ein.
Daraufhin wird das Image entsprechend unserer Dateien aufgebaut.
2.) Wenn wir nun den Befehl
docker image ls
eingeben sehen wir das von uns erstellte Image und natürlich auch das Image wordpress auf dem unser angepasstes Image basiert.
Wir haben nun ein Image zusammengebaut, aber bisher noch keinen Container, der auf diesem Image basiert, erzeugt. Wie wir bereits gelernt haben benötigt man für das WordPress-Image auch noch einen Container mit einem Mysql-Image in dem die Datenbank läuft auf der WordPress basiert. Wir haben gelernt, dass man eine komplette Umgebung über docker-compose definieren und hochfahren kann. Im Rahmen der docker-compose Datei kann man auch benutzerdefinierte Images zusammenbauen lassen, so dass man einen kompletten Prozess hat der nicht nur benutzerdefinierte Images erzeugt sondern darauf aufbauend direkt eine komplette, laufende Umgebung instantiiert. Das wollen wir nun machen.
3.) Wir haben immer noch das benutzerdefinierte Image das wir gerade erzeugt haben auf unserem Rechner liegen. Dieses Image müssen wir zunächst loswerden weil wir das Image im nächsten Schritt über docker-compose erzeugen werden. Um das Image zu entfernen geben wir den Befehl
docker image rm wordpress-custom
ein.
4.) Über erneute Eingabe des Befehls
docker image ls
sehen wir, dass unser angepasstes Image entfernt wurde und nur noch das grundlegende WordPress Image vorhanden ist.
Die docker-compose.yml Datei sieht wie folgt aus.
Sie ist sehr ähnlich zu der Datei die wir oben verwendet haben. Ein wichtiger Unterschied ist die Zeile build: ./. Hiermit geben wir an, dass das dockerfile das sich im gleichen Verzeichnis befindet auch ausgeführt werden soll.
5.) Lassen wir diese Datei nun einmal mit dem Befehl
docker-compose up -d
ausführen.
Nachdem diese Prozess durchgelaufen ist steht uns nun eine laufende WordPress-Umgebung zur Verfügung.
6.) Um das zu prüfen geben wir nun http://65.52.229.47:8080 in einen Browser ein.
Wie im vorherigen Beispiel auch wird uns die Installations-Seite von WordPress angezeigt. Wir könnten uns da jetzt, so wie im Beispiel weiter oben, durchklicken. Wir haben aber doch wp-cli installiert und können die Konfiguration von WordPress jetzt auch per Kommandozeile vornehmen. Und genau das werden wir jetzt auch machen.
7.) Innerhalb des laufenden Docker Containers können wir Befehle mit docker-compose exec ausführen lassen. Wir probieren das jetzt mal direkt mit
docker-compose exec wordpress wp core version
Über wordpress geben wir an in welchem Container der Befehl ausgeführt werden soll. wp core version gibt uns die Versionsnummer der WordPress Instanz aus. In meinem Fall (zur Zeit der Erstellung dieses Blogbeitrags) hat die aktuelle WordPress Version die Versionsnummer 4.8.2.
8.) Wir können nun unsere WordPress Installation auch über die Kommandozeile konfigurieren. Dazu geben wir den folgenden Befehl ein:
docker-compose exec wordpress wp core install --url=http://65.52.229.47:8080 --title=“PASS“ --admin_user=admin --admin_password=password --admin_email=frank_geisler@geislers.net.
Im Einzelnen funktioniert der Befehl wie folgt docker-compose exec gibt an, dass wir einen Befehl in einem Docker Container ausführen möchten den wir über docker-compose erstellt haben. wordpress gibt an, dass der Befehl im WordPress Container ausgeführt wird. wp core install schließlich ist der eigentliche Befehl den wir zum Installieren bzw. Konfigurieren unserer WordPress Instanz benötigen. Über –url=http://65.52.229.47:8080/ geben wir an welche WordPress Instanz auf dem WordPress Server installiert werden soll. Es ist denkbar dass wir mehrere WordPress Instanzen auf unterschiedlichen URLs auf einem Server laufen haben und über den Parameter –url geben wir an auf welche wir uns beziehen. –title=“PASS“ setzt den Titel unserer neuen WordPress Website. Über –admin_user=admin und –admin_password=password geben wir den Login-Namen und das Kennwort für den administrativen Account unserer WordPress Installation an. Es sollte jedem klar sein, dass diese Angaben nur Beispiele sind und bitte so nicht in einer produktiven Umgebung verwendet werden sollten. –admin_email=frank_geisler@geislers.net schließlich gibt die E-Mail Adresse des Administrators an.
9.) Nachdem der wp core install Befehl erfolgreich durchgelaufen ist geben wir nun noch einmal http://65.52.229.47:8080 in einen Browser ein. Im Gegensatz zu vorhin wird nun nicht mehr der Installations-Bildschirm angezeigt sondern eine konfigurierte WordPress Seite mit dem von uns vergebenen Titel.
10.) Natürlich können wir uns an dieser WordPress Website nun auch mit den oben angegebenen Login Informationen einloggen. Dazu scrollen wir etwas auf der Seite nach unten und klicken auf den Link Log in.
11.) Im Anmelde-Bildschirm geben wir nun einfach als Username admin ein, als Password password ein und klicken dann auf die Schaltfläche Log In.
12.) Wir werden nun auf das WordPress Dashboard weitergeleitet über das die WordPress Instanz verwaltet werden kann.
Zu guter letzt räumen wir jetzt noch unsere Umgebung auf.
13.) Über
docker-compose stop
halten wir alle Container die durch das docker-compose.yml Script erzeugt wurden wieder an.
14.) Über
docker-compose rm
entfernen wir die beiden erzeugten Container nach Bestätigung der Sicherheitsabfrage mit Y.
In diesem Blogartikel wurde gezeigt wie man auf Basis eines vorhandenen Docker Images ein eigenes Image mit zusätzlich installierter Software erzeugen kann. Wir haben gesehen wie man Befehle über wp-cli interaktv an den Docker-Container senden kann. Natürlich ist es auch möglich (und in produktiven Umgebungen macht das auch viel Sinn) auch diese Befehle in die entsprechenden Scripte einzubinden und dann entsprechend automatisch ausführen zu lassen so dass die komplette Umgebung automatisch erzeugt wird. Im der nächsten Blogbeitrag schauen wir uns an wie man selbst erstellte Images in Docker Hub zur Verfügung stellt.