Docker-Installation unter Debian und Verwaltung mit Portainer

Linux

Docker ist eine freie Software zur Isolierung von Anwendungen mit Hilfe von Containervirtualisierung. Im Gegensatz zu einer Virtualisierung mit einem Hypervisor vom Typ 1, welcher direkt auf der Hardware eines Computers läuft (z.B. ESXi) oder Typ 2, welcher als Anwendung (Virtualbox, VMware Player) unter einem bestehenden Betriebssystem läuft und dann weitere Betriebssysteme hostet, wird bei Docker lediglich eine Anwendung virtualisiert. Bei Docker wird also nicht ein komplettes Betriebssystem mit all seinen Möglichkeiten virtualisiert, sondern lediglich die gewünschte Anwendung, wie z.B. ein Webserver.

Dazu wird grundsätzlich ein Image gebaut, welches beim Start eines Containers geladen wird. Dazu werden vom Container abhängige Laufzeitvariablen (Pfade zu physischen Ordnern, nach außen zu öffnende TCP/UDP-Ports, etc.) übergeben. Das Image ist dabei so generisch gehalten, dass sich dieses jederzeit upgraden lässt (neue Version eines Webserver z.B.) und der Container mit denselben Laufzeitvariablen erneut gestartet werden kann. Wichtig ist hier, die Begriffe voneinander abzugrenzen. Ein Image ist nur ein Speicherabbild eines Containers, es lässt sich leicht austauschen und mit anderen teilen. Ein Container wird zur Laufzeit aus einem Image gebaut, es ist quasi die aktive Instanz eines Images mit den entsprechenden Laufzeitvariablen. Daten, welche auch nach dem Neustart eines Containers persistent verfügbar sein sollen, müssen natürlich auch extern gespeichert und beim Start übergeben werden – sonst würdest du zum Beispiel bei jedem Neustart immer nur die generische Startseite eines Web-Server sehen.

Docker ist nicht Bestandteil der Standard-Debian-Repositorien, weshalb du damit beginnst, deine Repositorien upzudaten und die Installation des Docker-Repository vorzubereiten

 $ sudo apt update
 $ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

Als nächstes musst du den offiziellen GPG-Schlüssel hinzufügen, damit das Repository auch per HTTPS abgerufen werden kann.

$  curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Im nächten Schritt fügst du das Docker-Repository zu deinen Paketquellen hinzu:

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Das war es schon an Vorbereitungen, als nächtes installierst du Docker (zuvor aber Paketquellen nochmal aktualisieren):

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Anschließend kannst du deine Docker-Installtion mit folgendem Befehl testen:

$ sudo docker run hello-world

Eine Aktualsierung der Docker-Installation erfolgt wie gewohnt mit:

$ sudo apt update
$ sudo apt upgrade

Wenn du Docker auch als nicht privilegierter User (Non-Root, also ohne sudo) administrieren möchtest, musst du den Standard-Benutzer zur Gruppe docker hinzufügen:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

Sobald du dich als Standard-Benutzer aus- und wieder eingeloggt hast, kannst du docker-Kommandos auch ohne sudo ausführen.

Näheres zur Installation von Docker auch unter anderen Systemen findest du unter https://docs.docker.com/engine/install/

Als nächstes installierst du dir die Community Edition von Portainer. Portainer CE ist eine grafische Web-Oberfläche zum Administrieren deiner Docker-Instanz wie Images, Container und so weiter. Wie bereits weiter oben erwähnt, musst du bei Containern Daten, welche auch nach einem Neustart erhalten bleiben sollen, extern auslagern. Das geschieht bei Docker über sogenannte Volumes. Also erstellen wir uns ein Volume für Portainer und starten Portainer:

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Wow, was für eine lange Zeile. Schauen wir uns die mal näher an.
Was zuerst auffällt ist, das es vorab keiner Installation von Portainer bedarf. Wenn Docker ein angegebenes Image (portainer/portainer-ce) nicht findet, lädt er es automatisch nach. Natürlich hättest du zuvor auch mit docker pull portainer/portainer-ce das Image laden können, aber dieser Schritt ist nicht wirklich notwendig. aber jetzt mal zu den weiteren Parametern

-d startet Portainer als Daemon (im Hintergrund), sprich der Container beendet sich nicht von alleine, sofern er einmal abgearbeitet wurde
-p bedeutet, das Docker den internen (rechter Wert) Container-Port 9000 nach außen auf Port 9000 (linker Wert) verfügbar macht
–name vergibt manuell internen Name des Containers (ansonsten wird er automatisch generiert)
–restart=always bedeutet, dass der Container bei Neustart des Hosts oder wenn der Container sich aus anderen Gründen beendet, selbstständig neu startet
-v bindet die Volumes (virtuelle Laufwerke) ein, hier docker.socks (bietet Zugriff auf Docker-Instanz) und portainer_data (variable Daten)

Anschließend kannst du im Browser mit http://ip-server:9000 die Weboberfläche von Portainer aufrufen (ersetze ip-server bitte mit deiner individuellen IP-Adresse deines Servers). Zuerst wirst du aufgefordert, ein Benutzerkonto anzulegen. Ich empfehle dir, auch als Benutzername etwas Individuelles auszuwählen. Vergiss nicht, das dein Server möglicherweise direkt über das Internet erreichbar ist und admin etc. als Benutzername ist für einen Angreifer schon die halbe Miete, dann muss er nur noch das Passwort ermitteln.

Portainer nach dem ersten Login

Im nächsten Dialogfeld wählst du ganz links Docker als Umgebung aus und klickst auf Connect….Tada! Portainer is running! Mit einem Klick auf den Endpunkt local, gefolgt von einem auf Container werden dir alle derzeitigen Container (vermutlich portainer im Status running und ein weiterer aus dem Image hello-word mit einem generischen Namen im Status stopped) angezeigt.

Endpunkt-Übersicht

Nähers zur Verwaltung mit Portainer unter https://documentation.portainer.io/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.