Category Archive Docker

YAD(-C) Tutorial (Yet another docker(-compose) Tutorial)

In den folgenden Zeilen will ich euch eine kurze Einführung geben, wie man einen Server mit Docker und Docker-Compose am besten einrichtet. Dieses Tutorial dient mehr oder minder als Vorbereitung auf einge weitere Tutorials, die auf Docker aufbauen. Daher erklärt es eher, was ihr eingerichtet braucht um Docker so zu verwenden, wie ich es in den anderen Tutorial tue.

Keine Lust alles zu lesen? Soll einfach laufen? -> tl:dr

Da Ubuntu das Lieblings-Unix des Authoren ist, werden wir dieses als Grundlage nutzen. Im Vorliegenden Tutorial handelt es sich um ubuntu-20.04.1-live-server-amd641

Was ist Docker?

Docker ist eine Freie Software zur Isolierung von Anwendungen mit Hilfe von Containervirtualisierung.

Docker vereinfacht die Bereitstellung von Anwendungen, weil sich Container, die alle nötigen Pakete enthalten, leicht als Dateien transportieren und installieren lassen. Container gewährleisten die Trennung und Verwaltung der auf einem Rechner genutzten Ressourcen. Das beinhaltet laut Aussage der Entwickler: Code, Laufzeitmodul, Systemwerkzeuge, Systembibliotheken – alles was auf einem Rechner installiert werden kann

Docker (Software) – https://de.wikipedia.org/wiki/Docker_(Software) [Stand_ 03.01.2021]

Okey wenn ihr die Wikipedia lesen wollen würdet währet ihr wahrscheinlich nicht hier. Also wollen wir das mal übersetzen:

Docker ist eine Virtualisierungssoftware (wer sich an dieser Stelle die Frage stellt, was eine Virtualisierungssoftware ist, liest dann doch besser die Wiki und kommt danach zurück), bei der anders als bei anderen Anwendungen auf diesem Gebiet nicht immer ein ganzes Betriebssystem eingerichtet werden muss. Docker stellt uns vorbereitete Images und Container zur Verfügung auf deren Basis wir unsere Software einrichten können. In der Theorie spart dies sowohl Arbeit als auch Ressourcen, in der Praxis habe ich das Gefühl, dass die Trennung und Wartbarkeit eher der Vorteil sind. Jeder Container (was das ist, dazu kommen wir später) läuft für sich Isoliert und kann andere Container nur in geringen Masse beeinflussen. Da sich bei der Virtualisierung, egal ob Container oder Voll, die virtuellen Maschinen (VMs) dieselbe Hardware teilen, können besonders ressourcenhungrige Vertreter ihrer Art leicht Ressourcen ihrer Kollegen auslasten. Dies kann durch viele Parameter allerdings unterbunden werden.

Hier ein Beispiel für den Fall, dass mehrere VMs versuchen alles für sich zu beanspruchen (IT-Bezeichnung: Overprovisioning2):

Sind keine weiteren Parameter eingestellt, hat jede VM (Virtuellen Maschine) das Gefühl für sich allein die gesamte Hardware zur Verfügung zu haben. Und wird versuchen so viel Ressourcen zu beanspruchen wie sie für richtig hält. Grade Datenbanken neigen dazu dabei bis zu 90 % einfach zu belegen, nicht weil sie müssten, sondern weil sie schneller sind, wenn sie das Tun. Virtualisiert man nun 2 Datenbanken werden beide versuchen 90 % der Ressourcen des Hosts zu beanspruchen, und aus ihrer Sicht Erfolg dabeihaben, was dazu führt das nun 180% des z.B.: Arbeitsspeichers (RAM) beansprucht werden. Leider hat unserer Virtualisierungshost (der Rechner, auf dem die Software physikalisch läuft) dadurch nicht auf einmal mehr Arbeitsspeicher. Also muss er gucken wie er damit klarkommt. Einer VM zur Laufzeit (der Zeit, in der sie eingeschaltet ist) Arbeitsspeicher zu entziehen ist in der Regel nicht möglich und wird durch einen Absturz quittiert (Ausnahmen lassen wir hier mal unter den Tisch fallen), also muss ein anderer Weg her. Dieser Weg nennt sich Auslagerungsdatei (Windows) oder Swap (unixbasierte Betriebssysteme), hierbei werden die Daten des Arbeitsspeichers, die nicht mehr hineinpassen, auf einer Festplatte gespeichert. Das dies langsamer ist brauche ich wohl kaum sagen.

Vorwort , Vorbereitungen und Installation

Bei allen Befehlen wird davon ausgegangen, dass man nicht als root user sondern als ein User mit sogenannten sudo-Rechten3 auf einer Konsole (shell / Terminal / SSH / etc.) angemeldet ist. Solltet ihr als root angemeldet sein könnt ihr auf das sudo zu beginn aller Befehle verzichten ( obwohl es auch als root user nicht schlimm ist dies mitzutippen).

Bevor man irgendetwas unter Ubuntu installiert, sollte man sicherstellen, dass alle Updates installiert sind:

sudo apt update && sudo apt dist-upgrade -y

Diese Zeile beinhaltet 2 Anweisungen :

apt update:
Aktualisiert die Packetliste, also das Verzeichnis, in dem gespeichert wird, was Installiert werden kann.

apt dist-upgrade -y:
Startet die eigentliche Aktualisierung inclusive Betriebssystem. Das -y sorgt dafür, dass wir nicht noch einmal gefragt werden ob wir das wirklich tun wollen

Nach dem wir nun wissen, dass unser Ubuntu auf dem aktuellen Stand ist, können wir uns daran machen, alles zu installieren was wir brauchen (könnten).

sudo apt install python3-pip -y

Diese Zeile hat eigentlich nichts mit Docker zu tun, sondern installiert einen Python3 Paketmanager. Da wir aber später einige unterstüzende Module aus dem Python Repository benötigen installieren wir dies gleich mit.

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

Bei diesen 5 Paketen handelt es sich um Voraussetzungen, die lt. Docker.com für docker benötigt werden. Ich werde an dieser stelle nicht darauf eingehen, was die einzelnen Pakete tun, da dies den Rahmen sprengen würde. Da in der Unixwelt allerdings Dokumentation recht groß geschrieben wird, lässt sich das bei weitergehender Neugierde sehr leicht mit der Suchmaschine deiner Wahl ermitteln.

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

curl, eins der Pakete das im vorangegangenden Schritt installiert wurde, läd nun den Schlüssel für das Docker Repository herunter. Hierdurch können wir Pakete direkt von docker.com installieren.

apt-key add sorgt dafür, dass wir diesem Schlüssel auch vertrauen.

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

Nach dem wir dem Repository vertrauen, können wir diesen nun auch unseren Repositories hinzufügen.

sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io -y

Ähnlich wie bereits zu Anfang werden hier wieder einge befehle direkt hintereinander ausgeführt.

apt update aktualisiert erneut die Liste der installierbaren Paketen, nun allerdings inklusive der Pakete, die unter download.docker.com liegen.

apt install installiert die benötigten Pakete. Das Suffix -ce bei den Dockerpaketen sagt uns das wir die kostenlose Community Edition installieren.

Für docker war es das schon, da docker aber erst so richtig Spass macht wenn wir es auch automatisieren, installieren wir uns gleich auch noch docker-compose. Eine Engine die es uns erlaubt mehrere Container auf einmal zu starten.

Docker-compose Installation

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose ist ein einzelnes programm, dass wir einfach herunterladen könnten und damit fertig wären. Aber das ist uns ja zu langweilig also wollen wir auch noch, dass es aus egal welchen Ordner heraus aufgerufen werden kann.

sudo chmod +x /usr/local/bin/docker-compose && sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

diese letzte Zeile macht die datei docker-compose ausführbar, sorgt also dafür das unser Linux bereit ist diese auch als Programm anzuerkennen und fügt sie als Verküpfung zu den global verfügbaren Befehlen hinzu.

tl;dr

Wenn ihr einfach nur Docker unter Ubuntu 20.04 ans laufen bekommen wollt könntet ihr einfach alle Befehle von oben in ein einziges .sh Script kopieren, ausführen und glücklich sein. Dieses Script sähe dann wie folgt aus:

install.sh

#!/bin/sh
#System update
sudo apt update && sudo apt -y dist-upgrade

#Setup Python3 deps
sudo apt install python3-pip -y

#SetupDocker
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

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

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

sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io -y

#Setup docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Auf der Konsole:

sudo chmod +x ./install.sh && sudo ./install.sh

Sieh zu wie tausende Zeilen über den Bildschirm fliegen, fertig …

Viel Spass

Show 3 footnotes
  1. Download (https://releases.ubuntu.com/20.04.1/ubuntu-20.04.1-live-server-amd64.iso)
  2. Ich weiß, dass Overprovisioning ursprünglich nur Speicherplatz bezeichnete, aber in der letzten Zeit wird der Ausdruck auch immer öffter für alle Ressourcen genutzt
  3. Sudoer sind Nutzer die Systemnahe Befehle ausführen dürfen, hierzu müssen sie jedoch ihr eigenes Passwort erneut eingeben. Goth sei dank müssen sie dass allerdings nur 1 mal innerhalb eines bestimmten Zeitraums und nicht für jeden Befehl einzeln