Was sind Container?
Möchte man unterschiedliche Programme auf dem gleichen System ausführen, aber virtuell voneinander trennen, gibt es zwei grundlegende Möglichkeiten. Die erste ist, mehrere virtuelle Betriebssysteme zu emulieren, auf denen dann die jeweiligen Dienste ausgeführt werden. Dies hat den Nachteil, dass der Hostkernel virtuelle Kernel, BIOS, Hardware etc. simulieren muss und so wesentlich ineffizienter ist.
Die zweite Möglichkeit ist das sogenannte Containering bzw. Containerisierung, welches die Dienste ohne gravierenden Zwischenschritt voneinander trennt. Die Trennung erfolgt dabei durch separate Namespaces und sogenannte cgroups.
Unter Containerisierung wird die Methode verstanden, mehrere Instanzen eines Systems getrennt auf einem Hostsystem zu betreiben. Die Container dienen dabei zur Abgrenzung der einzelnen Services / Anwendungen voneinander. Diese werden mit all ihren Abhängikeiten als Image erstellt und können ohne Installation auf unterschiedlichsten Zielsystemen gestartet und verwendet werden. Containeranwendungen sind dadurch sehr portabel und können schnell und einfach eingesetzt werden.
In der Entwicklung und Qualitätssicherung beschleunigt die Containisierung der Anwendungen die Geschwindigkeit, in der neue Testumgebungen bereitgestellt werden können. So kann z.B. über einen Jenkins Build für jeden Feature Branch ein oder mehrere Containerimages für Application Server und Datenbanken erstellt werden, mit deren Hilfe der Feature Branch als eigenständige Umgebung hochgefahren wird. Tests können so schneller und unkomplizierter auf einer minimalen Testumgebung durchgeführt werden.
Was ist Docker?
Docker ist eine Software, die es ermöglicht leichtgewichtige mehrschichtige Container zu erzeugen. Die Docker Engine ist für Linuxsysteme optimiert und entwickelt, funktioniert durch Nutzung einer virtuellen Hyper-V Maschine aber auch unter Windows (setzt Windows 10 Pro oder Enterprise voraus!) und MacOS. Der sogenannte Docker-Daemon verwaltet die einzelnen Prozesse und Dienste, die virtuell voneinander getrennt, jedoch auf dem selben Hostkernel ausgeführt werden. So sind Programme bis auf ein paar wenige Schnittstellen vollkommen vom OS und der Hardware isoliert.
Praktische Anwendung
Der praktische Einsatz von Docker erfolgt über sogenannte Images. Images stellen diverse Strukturen und Abhängigkeiten bereits „vorkonfiguriert“ bereit, um die benötigten Funktionalität schnell einsetzen zu können. Gleichzeitig wird dabei die rundlegende Sicherheit gewährleistet. „Offizielle“ Images (Dockerfiles) können über DockerHub bezogen werden.
Ein Container ist eine aktive Instanz eines Images, somit können mehrere Container den gleichen Dienst ausführen und damit den Appliaktionsbetrieb skallieren oder robust aufrecherhalten.
Wichtig sind Images vor allem in der Softwareentwicklung und bei Webdiensten, da sie systemunabhängig sind. So können Entwicklerteams beispielsweise ein Image einer definierten Entwicklungsumgebung erzeugen und nutzen, wodurch systemspezifische Unterschiede der einzelnen Entwickler elieminiert werden. Das macht es vor allem im Continuous Integration Workflow interessant.
Ein sehr beliebtes Beispiel im Webdevelopment ist der WordPress Container. Das CMS läuft auf Webserven in der Regel als Container, um eine virtuelle Trennung zu erreichen. Dies ermöglicht zum einen das Betreiben mehrerer Webdienste über einen Server, als auch eine gewisse Sicherheit, da mehrere Ebenen zwischen Endbenutzer und Daten- bzw. Logikstrukturen existieren.
Vor- und Nachteile von Docker
Vorteile
- Sehr gute Portabilität von Images
- Isolierte leichtgewichtige Sandbox-Virtualisierung
- Deutlich höhere Performanz im Vergleich zu virtuellen Maschinen
- Wiederverwendung von Host-Kernel
- Minimale Betriebssystembibliotheken im Container-Image
- Schnelles Bereitstellen, Hoch- und –Herunterfahren, Portabilität
- Sehr geringer aktiver Ressourcenverbrauch (CPU, Arbeitsspeicher)
- Immutabilität der Container-Images
- Beliebig viele Container-Instanzen aus Container-Image hochfahrbar
- Sehr geringer passiver Ressourcenverbrauch für viele Instanzen (Festplattenplatz)
- Einfaches Erweitern der vorhandenen Container um weitere Schichten durch Layering und Versionierung
- Sehr gute Dokumentation und zahlreiche Tutorials
- Sehr gute (adaptive/dynamische) Skalierung
- Optimal für Micro-Services und SOA Umsetzung geeignet
Nachteile
- Potentielle Sicherheitslücken sind möglich
- Hohe Affinität zu Konsolenanwendungen erforderlich
- Gute Kenntnisse der Systemabläufe und „Sichtbarkeiten“ von Nöten
Verwandte Begriffe
- Jenkins
- Continuous Integration
- Continuous Delivery
- DevOps
- Azure
- AWS