Docker Einführung

Ähnliche Inhalte

Docker Einführung: Was ist Docker?

Herzlich Willkommen zu unserer Docker Einführung. In diesem Post erkläre ich was Docker ist. Ausserdem gehe ich darauf ein welche Konzepte hinter Docker stecken. Diese Konzepte sind unteranderem der Grund für die Popularität von Docker. Warum ist es Docker als Technologie gelungen so present zu sein? Kaum eine Konferenz bei der Docker nicht irgendwo vorkommt.

Das Problem

Früher waren Web und IT-Projekte einfacher und die Anforderungen konnten mit vergleichsweise wenigen Komponenten wie einem LAMP (Linux, Apache, MySQL, PHP) umgesetzt werden. Wenn ein Entwickler eine neue Funktion hinzufügen wollte, so hat er sich meist lokal eine Entwicklungsumgebung installiert. Auf dieser Entwicklungsumgegbung hat er alle Komponeten installiert, die er brauchte um das Projekt lauffähig zu machen. Da es sich hierbei um wenige Komponteten, wie zum Beispiel einen Webserver und eine Datenbank handelte hielt sich der Aufwand hierfür in Grenzen. Kurze Auszeiten für Wartungsarbeiten auf dem Produktivsystem wurden in Kauf genommen, wir waren es ja auch nicht gewohnt immer online zu sein und alles verfügbar zu haben.

Die Zeiten haben sich geändert und durch Shops wie Amazon, Suchmaschinene wie Google, soziale Netze sind wir es gewohnt immer online zu sein. Von der Suche erwarten wir wiederum, dass sie so funktioniert wie bei Google. Wenn ein Projekt, wie Beispielsweise ein Onlineshop hier mithalten will, so sind die Anforderungen an ein Onlineprojekt größer geworden. Um diese Anforderungen abzudecken, sind immer mehr Dienste in einem Onlineprojekt notwendig wie z.b.

  • Der Webserver, der die Webseite ausliefert.
  • Eine Datenbank, die Bestellungen und Kundendaten speichert.
  • Ein Suchserver wie elastic oder solr, der relevante Suchergebnisse liefert
  • Caches wie redis, die Ergebnisse zwischenspeichern
  • Statistiken, die Benutzeraktionen auswerten
  • ...

Mit diesen steigenden Anforderungen steigt zwangsläufig auch die Komplexität dieser Projekte. Auserdem erwartet der Benutzer, dass diese Dienste immer online sind und in einer angemessenen Zeit antworten und funktionieren. Neuer Versionen eines Dienstes sollen möglichst ohne Unterbrechungen online gestellt werden(Continous Integration / Continous Deployments)

Diese steigende Komplexität bringt herausforderungen in der Entwicklung mit sich! Es dauert immer länger, wenn ein Entwickler alle diese Dienste manuell aufsetzen muss, oder wenn Änderungen am Produktivsystem immer händisch online gestellt werden müssen. Das ist zeitaufwändig und fehleranfällig!

Die Lösungen

Diese Entwicklung wurde schon von anderen früher erkannt und zum Beispiel durch virtuelle Maschinen mit Vagrant gelöst. Ein Entwickler konnte sich so eine vorkonfigurierte Box herunterladen um schnell einen lauffähigen Entwicklungsstand zu installieren. Mit Techniken wie Ansible oder Chef wurde programatisch beschrieben, wie aus eine Standardlinux installation, eine projektspezifische Installation mit allen Diensten wurde.

Eine VagrantBox ist hierbei eine virtuelle Maschine, das bedeutet, das dem Gastbetriebsystem vorgegaukelt wird, auf einer bestimmten simulierten Maschine zu laufen. Der Vorteil von diesem Ansatz ist, das ein Projekt in eine oder mehrere virtuelle Maschinen unterteilt werden kann und so alle Dienste für ein Projekt logisch von anderen Projekten getrennt sind.

Durch die Nutzung von virtuellen Maschinen und VagrantBoxen ergeben sich folgende Vorteile:

  • Die Umgebung ist logisch getrennt und eine Instanz auf einem anderen System kann schnell hergesellt werden.
  • Die Umgebung in einer VagrantBox kann dem Livesystem sehr ähnlich sein, da man z.b. das gleiche Betriebsystem verwenden kann.

Es hat aber auch Nachteile:

  • Boxen können vom Umfang relativ groß werden. Das Downloaden kann dementsprechend lange dauern.

Wie Docker es löst

Docker bedient sich einer neuen Abstaktion. Hierbei wird auf altbewertes zurückgegriffen und Dienste werden, wie im Transportgewerbe in Container gekapselt. Welche Vorteile haben z.b. Container im Transportgewerbe?

  • Sie haben eine standardisierte Schnittstelle und Größe. Dadurch können Sie auf LKWs und Schiffen gleichermassen verwendet werden
  • Das innere Spiel von aussen keine Rolle

Was wäre also, wenn wir Dienste in einem Projekt wie Container sehen könnten? Ein Container stellt nach aussen eine Schnittstelle bereit und dass innenleben muss uns nicht weiter interessieren, solange es tut was es soll? Wenn wir mehr Leistung für einen Dienst benötigen, so starten wir einfach mehrere Container?

Das ist der Ansatz von Docker. Die Schnittstellen sind hierbei Ports. Ein Container stellt Ports nach aussen bereit, hinter denen wiederum ein Dienst im Container läuft.

Ein Container ist hier aber nicht, wie z.b. bei virtualbox eine virtuelle Maschine! Ein Container ist ein Prozess der isoliert von anderen Prozessen läuft.

Das Dockerfile

Ein Docker Image wird beschrieben mit einem Dockerfile. Der Aufbau eines solchen Dockerfiles ist meistens relativ simpel. Das folgende Beispiel zeigt das Dockerfile für den Tika Server von Logicalspark:

FROM ubuntu:latest
MAINTAINER david@logicalspark.com

ENV TIKA_VERSION 1.18
ENV TIKA_SERVER_URL https://www.apache.org/dist/tika/tika-server-$TIKA_VERSION.jar

RUN	apt-get update \
	&& apt-get install openjdk-8-jre-headless curl gdal-bin tesseract-ocr \
		tesseract-ocr-eng tesseract-ocr-ita tesseract-ocr-fra tesseract-ocr-spa tesseract-ocr-deu -y \
	&& curl -sSL https://people.apache.org/keys/group/tika.asc -o /tmp/tika.asc \
	&& gpg --import /tmp/tika.asc \
	&& curl -sSL "$TIKA_SERVER_URL.asc" -o /tmp/tika-server-${TIKA_VERSION}.jar.asc \
	&& NEAREST_TIKA_SERVER_URL=$(curl -sSL http://www.apache.org/dyn/closer.cgi/${TIKA_SERVER_URL#https://www.apache.org/dist/}\?asjson\=1 \
		| awk '/"path_info": / { pi=$2; }; /"preferred":/ { pref=$2; }; END { print pref " " pi; };' \
		| sed -r -e 's/^"//; s/",$//; s/" "//') \
	&& echo "Nearest mirror: $NEAREST_TIKA_SERVER_URL" \
	&& curl -sSL "$NEAREST_TIKA_SERVER_URL" -o /tika-server-${TIKA_VERSION}.jar \
	&& apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

EXPOSE 9998
ENTRYPOINT java -jar /tika-server-${TIKA_VERSION}.jar -h 0.0.0.0

Was passiert hierbei um Dockerfile?

  • Mittels FROM kann ein bestehendes Dockerimage als basis genutzt werden. In diesem Fall Ubuntu
  • Durch ENV werden Environmentvariablen definiert
  • Die RUN Anweisung führt in diesem Fall mehrere Befehle aus, sie installiert die benötigten Basispakete (z.b. java und curl) und installiert dann den Tika Service
  • Mit EXPOSE 9998 wird der Port 9998 nach aussen bereitgestellt
  • Die Definition von ENTRYPOINT erlaubt es den Container ausführbar zu machen. Das definierte Entrypointskript wird ausgeführt und bekommt die Parameter durchgereicht, mit der der Container gestartet wurde.

Welche Vorteile hat das?

Durch die beschriebene Struktur des Dockerfiles and anderen Konzepten ergeben sich folgende Vorteile:

  • Dockerfiles sind meist relativ kurz und einfach zu verstehen
  • Durch eine Vererbung kann ein Container auf einem anderen Container aufbauen und es muss nicht alles im Dockerfile des Dienste konfiguriert sind
  • Eine Zeile im Dockerfile ist ein Layer, wenn ein Dockerimage installiert wird, werden diese Layer heruntergeladen. Layer die schon vorhanden sind, müssen nicht erneut geladen werden. Dadurch kann der Build eines Dockerfiles relativ schnell sein.

Das waren die ersten Schritt zu Docker. In einer der nächsten Blogposts wird beschrieben, wie aus einem Dockerfile ein Image und dann ein Container wird.

Navigation