blog.atwork.at

news and know-how about microsoft, technology, cloud and more.

Erste Schritte mit Docker-Teil 1

Im Oktober (u.a. rund um TechEd Europe) wurde eine Partnerschaft zwischen Microsoft und Docker bekanntgegeben. Microsoft wird Unterstützung von Docker in Azure und Windows Server einbauen, so präsentierte es Mark Russinovich bei der TEE14 Keynote und Jason Zander im Azure-Blog in  New Windows Server containers and Azure support for Docker.

image

Was ist eigentlich Docker?

Docker ist eine Open Plattform um Applikationen in eigenen Prozessen geschützt laufen zu lassen und zu verwalten. Eine Applikation läuft in einem "lightweight container" auf einer Virtualisierungs-Plattform, ähnlich wie in einer virtuellen Maschine (VM), nur ist alles viel "schlanker". Und wesentlich schneller.

Dies wird durch die gemeinsame Nutzung des Host-OS, die logische Trennung in verschiedene Schichten und "App-Sandboxes" - die Container - erreicht. So können sehr viele (tausende) Container (Apps) auf einem physischen Host laufen. Für mich aus der Windows Welt ist dieses Konzept vielleicht am ehesten mit dem Windows Server und IIS vergleichbar, wo sehr viele Webs in eigenen Prozessen (App-Pools) auf einem Webserver voneinander getrennt laufen können.

Docker entstand aus dem Bedürfnis "Shipping code to the server is too hard" - gerade bei loose coupled Systemen auf unterschiedlichen Plattformen. Das bedeutet, eine bestimmte App befindet sich nun bereits (vom Developer) installiert in einem Container, der auf verschiedenen Hosts (mit demselben OS) laufen kann. Die Umgebung spielt dann keine Rolle mehr, der Container läuft genauso auf einem Notebook wie auf einem Server oder in der (Azure) Cloud.

Siehe auch What is Docker?

Die Architektur

Docker verwendet eine klassische Client-Server Architektur mit folgenden Komponenten:

  • Client: Der Docker Client gibt Befehle (wie Container laden, starten, etc.) an den Daemon über Sockets oder eine RESTful API weiter. Der Client läuft also im Regelfall remote, auf dem eigenen PC.
  • Daemon: Die Aktionen des Clients werden vom Docker Daemon auf einer Host-Maschine durchgeführt - in unserer Windows Welt ist das also ein "Service". Unter Azure werden Container aus der Azure Gallery direkt mit dem Docker Client verwendet werden können.

Bezeichnungen

Die wichtigsten Begriffe in Docker sind:

  • Image: Images sind read-only Templates von (virtuellen) Betriebssystem-Umgebungen, etwa ein Ubunto OS mit Apache, oder (in Zukunft) ein Windows Server mit IIS. Sie sind die Basis (Base Image) für eine App und werden (von einem Hub) geladen und auf einem Host ausgeführt.
  • Registry: Registries speichern die Images auf privaten oder public Servern. Die öffentliche Docker Registry heißt "Docker Hub" mit mittlerweile etwa 45.000 Containern und kann von registrierten Benutzern verwendet werden. Auch die Azure Gallery wird Docker Images anbieten.
  • Container: Ein Container basiert auf einem Image und beinhaltet alles, um eine App laufen zu lassen. Jeder Container stellt eine isolierte und sichere Application Platform dar. Hier sind alle erforderlichen Bibliotheken und der App-Programmcode gespeichert.

Unterschied zwischen einer VM und einem Container

Wenn eine VM Arbeitsspeicher erhält, gehört ihr dieser Speicher, genauso wie ein bestimmter Anteil der CPU(s) usw. Jede VM benötigt also einmal ein eigenes OS und zum Beispiel einmal 1GB RAM, bei 5 VMs also 5GB. Bei Docker ist das nicht so. Dadurch, dass sich die Container die gemeinsame Basis (ein Host-OS) teilen können, sind sie wesentlich schlanker.

In Containern werden Prozesse isoliert, aber die Ressourcen geteilt. So können auf einem Host tausend(e) Container laufen, ohne dass die Ressourcen stark beeinträchtigt werden. Ein voll virtualisiertes System benötigt durch die vollständige Isolation normalerweise Minuten zum Starten. Container starten üblicherweise in weniger als einer Sekunde.

Docker Basics

Man kann sich einen Container wie einen Prozess in einer (Sand)Box vorstellen. Der Container beinhaltet alles, um eine bestimmte App auszuführen, also ein eigenes Filesystem, System Libraries, eine Shell usw. Jedoch laufen standardmäßig alle diese Dienste nicht, sondern müssen bei Bedarf installiert werden.

In einem Container befinden sich meist mehrere Layer. In einem traditionellem Linux Boot mountet der Kernel zu Beginn das Root-File System - zuerst das boot file system (bootfs: Bootloader und Kernel), dann das root file system (rootfs: die Directory Struktur). Darauf läuft das Base Image (das entsprechende OS) und darauf weitere Images. In der Windows Welt sieht das prinzipiell ähnlich aus, es gibt den Windows-Kernel und eine Reihe von Services.

Container sind dabei immer nur "Differential" Images, also sehr klein. File-Änderungen werden immer in den Top-Layer (also in den Container) geschrieben. Wenn ein Container fertig "erstellt" ist, kann daraus ein neues Image erstellt werden usw.

image

Die Grafik zeigt den Aufbau eines Linux-Containers mit Debian von http://docs.docker.com/terms/layer.

Docker arbeitet also mit Container-Technologie und verschiedenen Layer zur Abstraktion zwischen Kernel, OS, Filesystem und weiteren Basisdiensten und darauf basierenden Layern. Änderungen im Dateisystem werden nur auf den eigenen Container angewendet, nicht auf das Base Image.

In Docker können auch verschiedene (Linux) Distributionen parallel laufen, siehe File System. Ein Container wird übrigens gestartet, indem der Prozess darin gestartet wird - und genauso wieder beendet, nämlich durch Beenden des Prozesses. Weitere Details siehe auch Understanding Docker.

Microsofts Docker Support

Docker wird in der nächsten Version von Windows Server unterstützt. Images können also auch bald unter Windows laufen. Das Development der Docker Engine für Windows Server wird Open Source und in Azure wird es Support für die Docker Open Orchestration APIs geben. In der Azure Gallery und im Portal werden Docker Hub Images angeboten werden. Die Grafik zeigt beide OS-Welten.

image

In der nächsten Windows Server Generation brauchen sich Developer also keine Gedanken mehr machen, wo die App läuft, sondern können ihre eigene .NET, ASP.NET oder PowerShell-App in einen Windows Container installieren und über Docker administrieren.

image

Docker for everyone?

Nun, die Architektur von Docker bietet viele Vorteile. Alleine die Möglichkeit, fertig installierte Apps in kleinen, schlanken und performanten Containern auszuliefern ist sehr reizvoll - und kann auf lange Sicht das Konzept, wie Unternehmen Apps deployen, ändern.

Aber natürlich hängt der Einsatz vom Szenario ab. Auf der Docker-Website gibt es einige offizielle Use Cases von bekannten Unternehmen nachzulesen.

In Teil 2 sehen wir uns an, wie sich Docker "anfühlt" und wie es grundsätzlich funktioniert.

Quicklinks:

Loading