public-docker-fun

Dieses Git-Repository ist eine kleine, einfache Demonstration für die Automatisierung von Software-Deployments mit Docker und Ansible. Damit wird die Verfügbarkeit der Software maximiert und Fehlerquellen werden soweit möglich vermieden.

Im Folgenden werden wir uns die einzelnen Komponenten der Gesamtlösung in chonologischer Reihenfolge anschauen und dann auf ihr Zusammenspiel eingehen, um aus den Einzelteilen ein Gesamtbild zu zeichnen.

Aufgrund gewisser… Limitierungen kann hier jedoch bisher noch keine wirkliche Gesamtlösung gezeigt werden. Diese würde umfangreiche Tests beinhalten und eine paketierte Software nur dann ausrollen, wenn alle Tests korrekt bestanden sind.

Git

Git ist ein freies Versionsverwaltungssystem, das von Linus Torvalds zur Verwaltung der Quellcodes des Linux-Kernels entwickelt wurde und heute wohl das verbreitetste Versionsverwaltungssystem ist. Es wird nicht nur von den bekannten Plattformen Github, Gitlab und Atlassian Bitbucket verwendet, sondern auch in der Industrie weithin genutzt.

Am Ende spielt es jedoch keine Rolle, welches System dabei eingesetzt wird. Wer mag, kann das hier gezeigte jederzeit auch mit Subversion, Mercurial, Fossil oder Bazaar umsetzen.

Webservice

Die hier ausgerollte Software ist ein kleiner Webservice in Go, der zusammen mit der Datenbank PostgreSQL verwendet wird. Letztlich ist das jedoch unwichtig. Mit den hier gezeigten Techniken können viele andere Softwaresysteme verwaltet werden: Content-Management-Systeme (CMS), Online-Shops, Datenbanken, Microservices, und so weiter.

Make

Das Werkzeug Make ist grundsätzlich entwickelt worden, um C-Quellcode in ein ausführbares Binärprogramm (Executable) zu übersetzen – dieser Übersetzungsvorgang wird auch “kompilieren” genannt. Dabei sind häufig mehrere Schritte in definierten Abfolgen nötig, und um diese Schritte, ihre korrekte Abfolge, und die dabei jeweils notwendigen Einstellungen übersichtlich in einer Datei unterzubringen, gibt es Make.

Make ist heute allerdings weit über seine Anfänge in der Entwicklung in der C-Entwicklung hinaus gewachsen und wird für eine Vielzahl von Automatisierungsaufgaben verwendet. Der Autor zum Beispiel verwendet es für die Übersetzung von C-, C++- und Golang-Programmen, aber auch zur Übersetzung von PDF-Präsentationen aus LaTeX- und Dokumentation aus Markdown-Quellcodes.

Zu den spannenden Eigenschaften von Make gehört, daß es sogenannte “Targets” unterstützt. Wer sich die Datei “src/Makefile” anschaut, sieht: darin gibt es (unter anderem) die Targets “all”, “compile”, “compress” und “install”, wobei “all” nur das Target “compile” und “compile” verschiedene Shellbefehle aufruft.

Das Makefile hier ist sehr rudimentär, aber es kann unkomprimierte und komprimierte Executables für Linux und Windows erzeugen, und sie sogar installieren. Es gäbe noch viel, das sich über Make schreiben ließe – an dieser Stelle soll das jedoch erst einmal genug sein.

Docker

Vor einigen Jahren noch hielt ich Containerisierung für einen dieser Hypes, die immer wieder gerne durch die IT getrieben werden, während ich andererseits immer wieder von unseren Consultants gefragt worden bin, was das denn sei und was es damit auf sich habe. Darum habe ich mir das etwas genauer angeschaut – und war schnell begeistert. Kurz danach hatte ich ein Gespräch mit meinem Chef und sollte seine Frage beantworten, das ihm dieses Docker denn nutze. Dabei hatte ich keine gute Antwort, und habe bis heute keine – weil es so viel ist.

Fangen wir am Anfang an und lassen die systemtechnischen Belange mal außen vor, bietet Docker eine standardisierte Laufzeitumgebung. Oder verkürzt gesagt: ein einmal erzeugtes Docker-Image läuft überall, ob auf Linux oder Windows oder MacOS, ist zunächst gleichgültig.

Die Basics

Ganz grundsätzlich erzeugt man ein Docker-Image, darin befindet sich ein Großteil dessen, was zum Starten eines Programms notwendig ist: zuerst das Executable (“ausführbares Programm”) mit den Bibliotheken und womöglich weiteren Dateien, die es zum Starten laden muß.

Ansible