Nachdem unser Proxmox-Server nun seit einiger Zeit läuft (und auch schon ein paar virtuelle Maschinen – VM – ihren Dienst tun), ist es an der Zeit, mal einen Linux-Container (LXC) einzurichten. Der geneigte Leser mag nun grübeln, warum wir einerseits virtuelle Maschinen nutzen, andererseits aber nun einen Container einrichten wollen. Also…

Virtuelle Maschinen sind komplette „Computer im Computer“ – also ganze Rechner mit einem eigenen Betriebssystem, die installiert werden wie ein physisches Blech: Betriebssystem-DVD rein, booten, installieren, fertig. Das bietet Möglichkeiten, die über das, was Container bieten, hinausgehen. So ist es beispielsweise möglich, auf einem Linux-Host auch Windows in einer virtuellen Maschine zu installieren.

Container nutzen die Ressourcen des Host-Betriebssystems. Dadurch ist es nicht möglich, „Windows-Container“ auf Linux-Hosts zu installieren. Der Vorteil ist, dass ein Container wesentlich weniger Systemressourcen benötigt als eine virtuelle Maschine (der Container ist sozusagen nur ein „Aufsatz“, der an das Host-System angeflanscht wird).

Das Ziel ist jetzt, einen Linux-Container aufzusetzen, in dem Docker läuft, das wiederum verschiedene Container ausführt (also Container im Container). In diesem Beitrag geht es darum, den LXC zu erstellen und Docker zu installieren. Die Installation der eigentlichen Container folgt dann in den nächsten Teilen dieser Serie. Geplant ist unter anderem folgendes:

  • Passwort-Management mit BitWarden
  • System-Monitoring mit CheckMK
  • Visualisierung mit Grafana
  • Dateiverwaltung mit Nextcloud
  • Office mit OnlyOffice (als Office-Server für Nextcloud)
  • STUN- / TURN-Server für Nextcloud-Talk
  • Docker-Verwaltung mit Portainer
  • Datenspeicherung mit influxDB
  • Und so weiter…

Die Möglichkeiten sind nahezu unbegrenzt – solange der Host mitmacht (wenn mein Host nur 8GB RAM hat, ich aber Container installiere, die 20 GB RAM brauchen, wird das mit an Sicherheit grenzender Wahrscheinlichkeit in die Hose gehen)…

Aber genug der Vorrede – los geht’s!

Nach der Anmeldung am Proxmox-Server klicken wir rechts oben auf die Schaltfläche „Erstelle CT“:

Dann wird der Assistent gestartet, der uns durch die Erstellung des Containers führt:

Im ersten Reiter werden wir gefragt, wie der Container heißen und auf welchem Host er liegen soll (das ist nur relevant, wenn man mehrere Proxmox-Server geclustert hat). Ganz wichtig: Das Kennwort! Damit melden wir uns später als root an diesem Container an. Es drängt sich also auf, dieses Kennwort zu behalten…

Weiter geht’s mit der Auswahl des Container-Templates. Ich habe nur Debian und Ubuntu heruntergeladen und entscheide mich für Ubuntu (das ist eine rein persönliche Präferenz, mit Debian, SuSE, Fedora, Gentoo und wie sie alle heißen, sollte es auch funktionieren).

Nun wird die Größe der „Festplatte“ abgefragt. Der Standard (8GB) scheint mir für das, was ich vorhabe, etwas wenig; daher hänge ich eine Null dran – damit sollte ich erstmal hinkommen. Wenn nicht, lässt sich die Größe nachträglich verändern (zumindest in eine Richtung: Mehr geht immer).

Mein Host hat noch ein paar Kerne übrig, deshalb fange ich erstmal mit vier Kernen an.

Mit dem RAM-Speicher sieht es ähnlich aus: Erstmal 4GB, weniger ist jederzeit möglich (mehr im Moment nicht, mein Host ist am Limit). Docker-Container brauchen in der Regel jedoch recht wenig Speicher, so dass diese 4GB auch durchaus zu viel sein können (das wird sich im laufenden Betrieb zeigen).

Im nächsten Schritt werden ein paar Netzwerk-Angaben benötigt. Kleiner Fallstrick: Die IPv4-Adresse steht auf „Statisch“; trägt man keine Adresse ein, kriegt der Container auch keine (da bin ein paar Mal drauf reingefallen). Die IPv4-Adresse muss mit der Subnetzmaske eingetragen werden (192.168.1.12/24). Für IPv6 nutzen wir die statuslose Autokonfiguration (SLAAC).

Die DNS-Einstellungen können grundsätzlich so beibehalten werden, wie der Assistent sie vorschlägt („Werte vom Host übernehmen“); ich bevorzuge es allerdings, die Daten, die ich haben will, direkt einzutragen.

Das war’s – fast. Im letzten Schritt wird nochmal alles zusammen gefasst. Mit einem Klick auf die Schaltfläche „Abschließen“ wird der Container erstellt:

Im Idealfall lautet die letzte Meldung „TASK OK“. Wenn nicht, wird (hoffentlich) eine aussagekräftige Fehlermeldung ausgegeben, die bei der Beseitigung des Problems hilft. Bevor wir diesen Container nun aber starten, müssen wir noch zwei Kleinigkeiten anpassen:

In den Optionen des Containers müssen wir noch das Feature keyctl aktivieren. Damit gestatten wir dem Container einen Systemaufruf (nämlich keyctl()) – den braucht’s für Docker:

Zusätzlich setzen wir noch den Haken bei „Beim Booten starten“:

Der macht, was er soll: Wird der Host neu gestartet (beispielsweise nach dem Einspielen von Updates oder – was bitte nicht passieren möge – einem Stromausfall), wird der Container automatisch mit gestartet. Das ist nicht zwingend erforderlich, erleichtert die Sache aber ungemein, wenn man gerade mal keinen Zugriff auf den Host hat (z.B. weil der Zugriff auf den Proxmox-Server übers Internet nicht freigegeben ist und man gerade im Urlaub weilt)…

Jetzt sind wir soweit fertig, dass wir den Container starten können. Dafür klicken wir auf „Konsole“ und dann rechts oben auf „Start“. Nun können wir uns anmelden (als root mit dem vergebenen Kennwort). Bevor wir Docker installieren, folgt die übliche Updaterei; außerdem installieren wir noch Curl (das brauchen wir, um das „Docker Convenience Script“ herunterladen zu können):

apt-get update
apt-get dist-upgrade
apt-get install curl

Danach laden wir das eben erwähnte Script herunter und führen es aus:

curl -fsSL https://get.docker.com -o get-docker.sh
sh ./get-docker.sh

Das Script installiert Docker vollautomatisch. Hat alles geklappt, sieht die Ausgabe in etwa so aus:

Herzlichen Glückwunsch! Wir haben einen Linux-Container mit Docker. In den nächsten Teilen dieser Serie werden wir ihn mit Leben (also Containern) füllen.