In den letzten Jahren finden Container immer mehr Einzug in die IT Landschaften. Sei es als Spielwiese zum Test von Applikationen oder als Lösungen für Continuous Integration und Deployment Prozessen.

Doch was sind Container und warum werden diese häufig mit Virtuellen Maschinen verwechselt?

Den ersten Anschein nach, könnte man meinen, dass beide Systeme das Gleiche machen.
Unter der Haube sieht dies jedoch ganz anders aus.

Docker Logo Image

Virtualisierung

Bei der Virtualisierung wird ein kompletter PC bzw. Server, inkl. Betriebssystem, als Hülse nachgebildet. Sprich ein Hypervisor (ein Stück Software) nutzt dazu die Hardware des physikalischen Servers und baut eine Schicht zwischen den virtuellen Maschinen und dem Host auf. Über dieser Schicht laufen dann einzelne Virtuelle Maschinen die wiederum ihr eigenes Betriebssystem haben.

Die einzelnen virtuellen Maschinen sind voneinander getrennt und können unabhängig voneinander konfiguriert werden.

Hypervisor werden im Übrigen als Typ 1 und Typ 2 Hypervisoren unterschieden.

  • Typ 1 Hypervisor – Läuft nativ auf der physikalischen Hardware und bringt sein eigenes Betriebssystem(Linux) mit.
    Beispiel: VMware ESXi Server
  • Typ 2 Hypervisor – Benötigt als Host ein vorinstalliertes Betriebssystem (z. B. Windows) und wird darauf als extra Programm installiert.
    Beispiel: Oracle VirtualBox oder Microsoft Hyper-V

Achtung! Virtualisierung sollte nicht mit Emulation verwechselt werden!
Bei der Emulation wird ein Stück Hardware komplett durch eine Software nachgebildet… Eben emuliert!
Virtualisierung nimmt aber die reale, physische Hardware und reicht diese an den jeweiligen Hypervisor durch, ohne deren Funktion nachzubilden.

Container

Bei einem Container sieht das wiederum anders aus. Hier handelt es sich nicht um eine Virtualisierung, sondern um eine Isolierung einer Anwendung.

Der Container nutzt die Ressourcen des lokalen Betriebssystems (z.b. Linux) und kapselt eine Anwendung mit all ihren notwendigen Abhängigkeiten und Laufzeitumgebungen ab.

Wie auch bei der Virtualisierung findet hier eine Trennung der einzelnen Container, als auch der Container zum Host-Beriebssystem statt. Jedoch ohne eine zusätzliche Schicht, welche wiederum ein eigenes Betriebssystem benötigen würde, aufzubauen.

Der Vorteil ist hier, dass ich mehrere gekapselte Anwendungen auf einem System laufen lassen kann, und hierbei die volle Performance des Betriebssystems nutze. Die Container lassen sich auch von einem System auf das andere übertragen, ohne das am Host-Betriebssystem Änderungen durchgeführt werden müssen.

Wer genauere Informationen zu den Unterschieden zwischen Containern und virtuellen Maschinen sucht, sollte sich mal den Artikel der Computerwoche durchlesen.

Was machen wir in diesem Tutorial?

Nun aber mal zurück zum eigentlichen Thema.

In diesem Tutorial schauen wir uns Step by Step an, wie wir mit einfachen mitteln eine Debian Linux VM erstellen und einrichten werden. Auf dieser wird dann die Docker Einrichtung durchgeführt und hierauf eine Docker GUI als Container eingerichtet und gestartet.

Zum Abschluss lassen wir hier noch eine Applikation in einem Container laufen, über die wir von unserem Host Computer darauf zugreifen.

Das Tutorial dient als einfachen, schnellen Einstieg für kleinere Tests-

Wir werden nun wie folgt, folgende Steps durchführen:

  • VirtualBox Installation und Einrichtung der VM
  • Installation und Einrichtung von Debian 9
  • Docker Installation und Einrichtung
  • Portainer Installation
  • Docker Einrichtung von Containern

VirtualBox und Debian 9 Setup

Wir werden also eine Virtuelle Maschine mittels VirtualBox erstellen.

VirtualBox ist der kostenlose Hypervisor von Oracle und kann für die gängigsten Betriebssysteme unter https://www.virtualbox.org/ heruntergeladen werden.

Damit VirtualBox funktioniert, muss am jeweiligen PC oder Server im BIOS die Virtualisierung-Funktion aktiviert werden. (Häufig unter den Advanced Settings im BIOS zu finden)

Zusätzlich zur Einrichtung unserer Virtuellen Maschine, benötigen wir noch die aktuelle Debian 9 Net-Install ISO Datei.

Nach der Installation von VirtualBox erstellen wir eine neue Virtuelle Maschine über den Wizard.

Debian9 VM Setup1

Da wir hier nur eine Test-Installation mit wenig Applikationen machen, reichen in der Regel 1-2 GB Memory für die Virtuelle Maschine.

Die Festplattengröße kann beliebig gewählt werden. Für unseren Test sollten 20GB ausreichend sein.

Debian9 VM Setup2

Damit wir später über unser Client-Betriebssystem auf die Container zugreifen können, muss die Netzwerkeinstellung auf Bridge gestellt werden.

VirtualBox Debian 9 Network Settings

Wer an seinem Client einen WLAN Stick verwendet, sollte unter Umständen mal die einzelnen Adaptertypen in den VM Netzwerk Settings durchprobieren. Hin und wieder gibt es hier Probleme mit dem Aufbau der Verbindung.

Nach dem Start der Virtuellen Maschine, wird man nach dem Installationsmedium gefragt. Hier wird unsere Debian 9 ISO Datei hinterlegt.

Debian9 VM Setup3

Während der Installation können wir einen beliebigen Computernamen als auch ein Kennwort für den root Benutzer, so wie einen weiteren Benutzer angeben.

Das Domänen Feld belassen wir leer und das Netzwerk sollte automatisch erkannt werden. Die Festplatten Einstellung können wir auf den Standardwert belassen und die gesamte virtuelle Festplatte verwenden.

Nach Abschluss der Basisinstallation, versucht der Installer eine Verbindung zum jeweiligen Software Repository Server aufzubauen um weitere Pakete zu installieren.

Da wir unsere Installation so schlank wie möglich halten wollen, wählen wir im Softwaremenü nur die Punkte „SSH Server“ und „Standard-Systemwerkzeuge“ aus.

Debian9 Installation Software Pakete

Nach der Installation startet die VM neu und wir können uns mit dem root Benutzer einloggen.

Ich hatte bei meiner Instanz immer wieder Probleme mit der DHCP IP Vergabe über den lokalen Kabel Router, daher setzte ich die IP-Adresse in der /etc/network/interfaces Datei auf statisch.

Debian 9 IP Settings für Netzwerk Interfaces in VirtualBox

Achtung, bei der neuen Debian Version hat sich der Name des Netzwerkadapter von eth0 nun auf einen Bios Device Namen geändert.

Ab nun sollte die Virtuelle Maschine auch vom Host System via Ping erreichbar sein.
Ab diesem Zeitpunkt sollte eigentlich auch der Zugriff via Putty erfolgen. Leider macht uns hier die sshd Konfig noch einen strich durch die Rechnung.

Ping test zu Docker VM

Damit der Zugriff mit dem Root Benutzer und Putty klappt, muss in Datei „/etc/ssh/sshd_config“ noch der Wert PermitRootLogin aktiviert werden(‚#‘ Entfernen!) und dieser wie folgt angepasst werden „PermitRootLogin yes“.

Hier kommt Docker – Die Docker Einrichtung

Die VM ist nun bereit für die eigentliche Docker Einrichtung. Über Putty kann man nun auch sämtliche Kommandos via Copy & Paste einfügen.

Zuerst wird der Package Index aktualisiert und dann der HTTPs Zugriff auf die Repositorys für Aptitude aktiviert. (Wer sich direkt als ROOT anmeldet, benötigt den sudo Kommand nicht)

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

Hiernach muss der Offizielle Docker GPG Schlüssel für den erfolgreichen Zugriff hinterlegt werden und das Docker Stable Repository wird als Default für die Installation hinterlegt.

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/debian \
    $(lsb_release -cs) \
    stable"

Im Anschluss muss mittels „apt-get update“ nochmal der Package Index aktualisiert werden. Hier sollten nun auch die docker.com URLs in der Abfrage erscheinen.

Docker Einrichtung und Installation

Nun folgt die eigentliche Docker Installation. Da wir nur die letzte Stable Version verwenden möchten, reicht uns folgendes Kommando zur Installation.

sudo apt-get install docker-ce docker-ce-cli containerd.io

Nach Abschluss der Installation kann diese nun mit folgendem Befehl getestet werden.

docker run hello-world

Hierbei wird ein kleiner Hello World Container aus dem Docker Hub Repository geladen und gestartet. Dieser erzeugt bei erfolgreichem Start eine Ausgabe auf der Konsole. Die eigentliche Docker Einrichtung ist ab diesem Punkt abgeschlossen.

Nach der Docker Einrichtung fehlt noch eine GUI

Um seine Docker Container einfach über ein grafisches Interface zu administrieren, empfiehlt sich ein Tool wie z.b. „Portainer.io“. Dies lässt sich einfach als Docker Container herunterladen und ausführen, ohne das größere Änderungen am System durchgeführt werden müssen.

Im ersten Schritt wird für den Container ein Lokales Volume für die Daten in Docker eingerichtet. Hiernach erfolgt der Download und start des Portainer Containers. Dieser ist in unserem Beispiel dann über Port 9000 erreichbar.

docker volume create portainer_data
 
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer 

Fertig. So schnell hat man das Tool installiert und kann nun mittels lokalen Web-Browser über die IP der VM und dem Port 9000 zugreifen (Beispiel: http://192.168.0.25:9000)

Portainer Setup Admin Account

Nach dem Start muss für portainer.io noch ein Kennwort für den Admin Account hinterlegt werden.

Hin und wieder kommt es vor das portainer.io nach dem Login ins Dashboard wechselt und einen Endpoint Fehler bringt

portainer.io endpoint fehlermeldung

Sollte dies der Fall sein, hilft meist ein neu laden der Website und ein erneuter Login. Danach sollte folgender Screen erscheinen.

portainer.io docker einrichtung als local vm

In diesem Screen wählen wir die Local-Verbindung, da sich unser Docker und der portainer.io Container auf ein und derselben VM befinden. Danach sollte das Dashboard auch ohne starten.

Portainer.io Docker GUI für einfaches Management

Im weiteren Schritt empfiehlt es sich, die Public IP des Endpoints auf die IP unserer VM zu legen. Hiernach sollten auch alle Links zu den Containern im Webinterface ohne Probleme Funktionieren.

Portainer.io Endpoint Einrichtung für Webzugriffe.

Abschließend fehlt nur noch den Portainer Container in den Autostart zu legen. Ansonsten müssten wir bei jedem Neustart der VM diesen Docker Container manuell starten.

Laufende Container unter Docker

Hierzu wählt man in der Container Übersicht den Portainer-Container und setzt unter „Container Details“ die Restart Policy auf „Always“

Über das portainer.io Webinterface lassen sich nun beliebig viele Container einrichten und verwalten. Perfekt für eine kleine Testumgebung.