Docker: Grundlagen

Momentan bin ich dabei, mich mit Docker zu beschäftigen.
Docker wurde im März 2013 herausgegeben.

Was Docker nicht ist

Docker ist keine Programmiersprache und Docker ist auch kein Framework um Isolation zu erreichen.

Docker ist auch keine Virtualisierung, denn bei Virtualisierung wird Hardware simuliert, auf der die Programme ausgeführt werden. Virtuelle Maschinen brauchen meist verhältnismäßig lange, um zu booten und sie brauchen ein eigenes Betriebssystem (für das man eventuell auch eine Lizenz braucht). Virtualisierung ist für kleine Aufgaben daher ein ziemlicher Verwaltungsoverhead.

Was Docker IST

Docker ist ein Tool zum Helfen bei allgemeinen Problemen wie Installation, Entfernen, Updaten, Verteilen, Vertrauen und Verwaltung von Software.

Docker ist open source und darf daher von jedem verwendet, verändert und weitergegeben werden.

Docker ist eigentlich ein Kommandozeilenprogramm, ein Hintergrund-Daemon und ein Satz von Remote Services.

Docker benutzt die bestehenen Technologien, die von Linux schon seit längerem unter dem Begriff „container“ verwendet werden. Durch Docker wird die Verwendung quasi standardisiert.

Docker läuft auf dem host im User-Space, also nicht mit root- oder kernel-Rechten.

Ein Image ist ein Schnappschuß mit allem, was zum Aufsführen der Anwendung nötig ist.
Ein Container ist ein Image, welches ausgeführt wird.

Aus einem Image können beliebig viele Container erstellt werden, diese teilen nicht ihre Änderungen, die sie vornehmen, jeder Container läuft in seinem eigenen Bereich.

Probleme, die Docker löst

Durch die Verwendung von Docker kann man folgende Problemen lösen:

  • zwei Anwendungen brauchen unterschiedliche Versionen von einer Software
  • was bleibt später über, wenn man die Anwendung entfernt?
  • kann man alle Abhängigkeiten entfernen?
  • kannst du dich an alle Änderungen erinnern, die du zum Installieren der jetzt zu deinstallierenden Anwendung machen musstest?
  • Portabilität: Images können unter jedem OS mit Docker ausgeführt werden.

Als detached container wird ein Container bezeichnet, der im Hintergrund läuft ohne an Input oder Output angeschlossen zu sein.
Als interactive container wird entsprechend ein Container bezeichnet, der an Input und/oder Output angeschlossen ist.

Docker hilft beim Vermeiden von u.a. folgenden Konflikten:

  • 2 Programme binden sich an den gleichen Port
  • 2 Programme versuchen, die gleiche temp. Datei zu benutzen
  • 2 Programme benutzen unterschiedliche Versionen einer globalen „DLL“
  • 2 Kopien des selben Programms wollen die gleiche PID-Datei verwenden
  • Ein Programm verändert Umgebungsvariablen und ein anderes kann nicht mehr richtig arbeiten.

Identifizierung von Containern

Docker erzeugt zu jedem container eine 1024bit Nummer mit der er eindeutig zu identifizieren ist. Die ID kann überall verwendet werden, wo container anzugeben sind. Da sich die IDs normalerweise schon in den ersten 12 Stellen unterscheiden, reicht die abgekürzte Schreibweise normalerweise schon aus.

Man kann sich die erstellte ID natürlich auch speichern
Linux: CID = $(docker create webserver)
Das kann natürlich zu Metakonflikten führen, wenn eine Umgebungsvariable für mehrere IDs benutzt werden sollte.

Dieses Problem kann man zwar nicht umgehen, aber verschieben, indem man die ID in eine Datei schreiben läßt:
docker –cidfile /tmp/webcid webserver
erzeugt eine container ID Datei mit der ID drin. Das hat aber die gleichen Namensprobleme, wie manuell benannte container und Umgebungsvariablen.

Docker erzeugt aber zu jedem Container auch einen menschenlesbaren automatischen Namen. Dieser besteht aus einem (englischen) Adjektiv, einem Unterstrich und dem Nachnamen eines einflußreichen Wissenschaftlers, z.B. confused_einstein
Ob das wirklich besser handzuhaben ist als eine 12-stellige Nummer, sei dahingestellt.

Wenn man einen container starten will, der Links zu anderen containern braucht, muss es den anderen container bereits gestartet geben. Ringverkettungen sind somit nicht möglich.

Fehlerbehandlung

Wenn ein Programm abstürzt (oder überhaupt beendet wird) kann Docker automatisch versuchen, den container neu zu starten.
Dazu kann man beim Erstellen eines containers (run oder create) den Parameter –restart angeben. Er kennt 4 Einstellungen:

  • Immer neustarten, unabhängig von Bedingungen
  • Für eine vorbestimmte Zeit versuchen, den container neu zu starten
  • Versuchen neu zu starten, wenn ein Fehler festgestellt wurde
  • Nie neu starten (Standard)

Docker versucht dabei nicht ständig den container neu zu starten, sondern benutzt eine exponentielle Strategie. Zu jedem Versuch wird die Wartezeit verdoppelt. Während der Restart-Phase können keine Befehle ausgeführt werden, die ein laufendes System brauchen.

Entrypoints

Docker hat Entrypoints, die immer ausgeführt werden, egal welches Kommando man expizit übergibt Man kann den Entrypoint mit –entrypoint=“cat“ überschreiben, um sich z.B. das Startskript selbst anzeigen zu lassen.

Leave a Reply