/ blog

Mit Geistern bloggen

Es ist immer das Gleiche, ich versuche mir vorzunehmen mehr zu Bloggen und dann kommt irgendwie ein cooles Projekt dazwischen, sodass keine Zeit zum bloggen bleibt.

Eines dieser Projekte oder besser gesagt Themen mit denen ich mich beschäftigt habe, ist die Container Virtualisierung mit Docker.

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications.

Da es bei einem solchen Thema immer hilfreich ist, ein Versuchsobjekt zu haben, musste ich mir eine Applikation aussuchen, die ich in einem solchen Container laufen lassen kann. Die Wahl viel dabei auf Ghost, eine in node.js geschriebene, noch recht neue, minimale Blogging Plattform.

Warum ausgerechnet Ghost? Das ist recht einfach, ich hatte keine Lust die Abhängigkeiten direkt auf dem Server zu installieren und es gab da dieses tolle, fertige Docker Image. Vorher lief mein Blog unter Wordpress, dass mir nach längerer Zeit aber irgendwie zu klobig wurde. Ich brauchte einfach mal wieder einen Tapetenwechsel und da kam Ghost wie gerufen.

Nachdem ich jetzt genug darüber geschrieben habe, dass ich umgestiegen bin, jetzt der Teil wie das Ganze umgesetzt wurde.


[UPDATE] Da es das dockerfile/ghost Image nicht mehr gibt, bitte die Anleitung beachten wie ihr das ghost Image benutzt. [/UPDATE]

Docker und Ghost einrichten

Wie bin ich also vorgegangen um meine Blog zu dockerisieren, die Beiträge zu migrieren und dann die Geister zu rufen.
Zuerst ging es darum, die alten Posts aus dem Wordpress raus zu bekommen und zwar in einem Format das Ghost auch wieder importieren kann. Dabei hilft einem das Wordpress Plugin Ghost.

Als nächstes muss der Docker Container erzeugt werden. Dazu reichen nach dem installieren von Docker z.B. mit apt-get install docker.io folgende Befehle aus.

$ docker pull dockerfile/ghost
$ docker run -d -p 127.0.0.1:8800:2368 -v /opt/ghost/:/ghost-override dockerfile/ghost

Diese Befehle Brauchen allerdings etwas Erklärung. Der Befehl docker pull läd das angegebene Image automatisch runter. Das drauffolgende docker run erstellt den eigentlichen Container und startet ihn.
Das -d startet den Container im detached mode, also im Hintergrund.
Der nächste Teil, -p 127.0.0.1:8800:2368, sorgt dafür das der Port 8800 unter der localhost IP 127.0.0.1 an den Container Port 2368 weitergereicht wird. 2368 ist der Port des Containers an dem der darin laufende Ghost bzw. node.js Prozess lauscht. Wenn ihr hier keine IP sondern nur die Ports angebt, wird 0.0.0.0 angenommen, also alle lokalen IPs, wodurch es sein kann das euer Container bzw. Ghost direkt über die Server IP und Port 8800 erreichbar ist. Da ich aber noch einen nginx als Reverse-Proxy davor schalte ist 127.0.0.1 eine gute Idee.
Der letzte Teil -v /opt/ghost/:/ghost-override verknüpft das Volume /ghost-override mit dem Host Verzeichnis /opt/ghost/. Dies sorgt dafür, dass die Daten des Ghost Containers nicht im Container, sondern im entsprechenden Verzeichnis auf dem Host liegen. Warum? Weil Docker Container zustandslos, also ohne darin enthaltene Nutzdaten sein sollten. Das hat auch seine Gründe, denn der von Docker vorgeschriebene Update Weg für einen Container ist das Löschen und Neuerstellen des Selbigen. Das Volume sorgt so dafür, dass die Daten nach dem Neuerstellen des Containers noch oder besser wieder verfügbar sind. Wichtig ist hier, dass dieses Anleitung nur für das von mir angegebene Docker Image gültig ist.

Als Letztes muss jetzt noch der nginx Reverse-Proxy konfiguriert werden. Wichtig ist aber, wenn man in der Ghost Config für die Site URL https konfiguriert hat, muss in Nginx folgende Option gesetzt werden.

proxy_set_header        X-Forwarded-Proto $scheme;

Eine Beispiel Konfiguration für nginx gibts hier: http://files.benoswald.de/dockerGhostNginx.conf.txt

Linksammlung für den Artikel:
https://github.com/TryGhost/Ghost/issues/2796
https://registry.hub.docker.com/u/dockerfile/ghost/
http://www.allaboutghost.com/deploying-ghost-with-docker/