Containerverwaltung mit LXC

Aus LinuxUser 08/2016

Containerverwaltung mit LXC

© Bayberry, 123RF

Getrennte Welten

Per Chroot starten Sie ein weitgehend autonomes Gastsystem auf einem Rechner, ohne dabei die Hardware zu emulieren. Die Containerverwaltung LXC verfeinert diese Technik mit umfangreichen Zusatzfunktionen.

Seit mehreren Jahren ermöglicht LXC (“Linux Containers”) das Anlegen autonomer, vom restlichen System abgeschotteter Verzeichnisteilbäume. Im Gegensatz zu anderen Systemen nutzt LXC [1] dafür jedoch keine virtuellen Maschinen wie etwa Vmware, sondern erzeugt eine virtuelle Umgebung – zwar mit eigenen Prozessen, aber einem gemeinschaftlich genutzten Kernel des Hostsystems.

Erste Schritte

Die folgende Beschreibung bezieht sich auf Debian 8.0 “Jessie” als Wirt, lässt sich aber mit kleineren Änderungen auch auf andere Systeme wie OpenSuse oder Ubuntu übertragen.

Zunächst einmal installieren Sie die Pakete lxc, lxctl und libvirt-bin samt den vom Paketmanagement angeforderten Abhängigkeiten wie debootstrap. Bei eigenen Kernel-Konstrukten müssen Sie die Control Groups (Cgroups) aktivieren – prüfen Sie das gegebenenfalls über einen Aufruf des Kommandos lxc-checkconfig.

Abhängig von der Installationsquelle nimmt das Anlegen des Wurzel-Dateisystems für einen Container einige Zeit in Anspruch. Unter Debian erledigen Sie diese Aufgabe mit dem Befehl aus der ersten Zeile von Listing 1. Der Schalter LANG legt dabei bereits die Spracheinstellungen fest, SUITE definiert die gewünschte Vorlage. Mit der Option -n benennen Sie den Container (Abbildung 1). LXC verwendet für das Anlegen des Subsystems Vorlagen aus dem Verzeichnis /usr/share/lxc/templates/, die Sie hinter dem Schalter -t angeben. Es geht auch kürzer, wie ein alternativer Vorschlag aus dem Debian-Wiki [2] zum Erstellen des Containers zeigt (Zeile 2).

Listing 1

$ LANG=de_DE.UTF-8 SUITE=jessie MIRROR=http://httpredir.debian.org/debian lxc-create -n debian8 -t debian
$ lxc-create -n debian8 -t debian -- -r jessie
Abbildung 1: Beim Anlegen eines neuen Containers lädt LXC sämtliche benötigten Elemente aus dem Internet herunter und richtet ihn quasi schlüsselfertig ein.

Abbildung 1: Beim Anlegen eines neuen Containers lädt LXC sämtliche benötigten Elemente aus dem Internet herunter und richtet ihn quasi schlüsselfertig ein.

Nach erfolgreicher Installation endet die Prozedur mit der Ausgabe eines zufällig generierten Root-Passworts. Notieren Sie es, und vergeben Sie nach dem ersten Anmelden im Container via passwd ein eigenes. Die Eingabe von lxc-ls listet alle vorhandenen Container auf.

Um auf lokaler Ebene auf den soeben angelegten Container zuzugreifen, starten Sie diesen mit dem Kommando lxc-start -n debian8 -d. Wie bei fast allen LXC-Befehlen geben Sie mit der Option -n den Namen des Containers an. Vergessen Sie den Schalter -d nicht – andernfalls erscheint der Anmeldeprompt, der sich im selben Terminal nicht mehr beenden lässt. Fordern Sie danach via lxc-console -n debian8 eine Konsole mit dem Anmeldeprompt an (Abbildung 2).

Abbildung 2: Nach dem Start des Containers melden Sie sich via Terminal an diesem an.

Abbildung 2: Nach dem Start des Containers melden Sie sich via Terminal an diesem an.

Mit dem Aufruf lxc-info -n Container ermitteln Sie den Status und die Prozess-ID eines laufenden Containers. Das Kommando lxc-stop -n Container stoppt den laufenden Container wieder. Eine Auswahl der wichtigsten Steuerungs- und Kontrollprogramme finden Sie in der Tabelle “Wichtige LXC-Kommandos”.

Wichtige LXC-Kommandos

Aktion Kommando
Anlegen, klonen, löschen
Container anlegen lxc-create -n Container -t Vorlage
Container klonen lxc-clone -o Container -n NeuerContainer
Container löschen lxc-destroy -n Container
Starten und stoppen
Container starten lxc-start -n Container
Container anhalten lxc-freeze -n Container
Container fortsetzen lxc-unfreeze -n Container
Container beenden lxc-stop -n Container
Informationen
Liste aller Container lxc-ls
Liste aktiver Container lxc-ls --active
Liste gestoppter Container lxc-ls --stopped
Infos zu einem Container lxc-info -n Container
IP-Adresse des Containers lxc-info -i -n Container
Prozess-ID des Containers lxc-info -p -n Container
Container überwachen lxc-monitor -n Container
Anwendungen ausführen
Anwendung im Container starten lxc-attach -n Container --Befehl

Netzwerkkonfiguration

Um per Netzwerk auf den Container zuzugreifen, müssen Sie auf Wirt und Gast die Netzwerkeinstellungen anpassen. So gilt es, in beiden Fällen die Datei /etc/network/interfaces zu ändern. Weiterhin benötigen die Netzwerkeinstellungen für den Container unter /var/lib/lxc/Container/config Anpassungen. Um den Container im LAN mit seinem Namen anzusprechen, erweitern Sie die /etc/hosts um einen entsprechenden Eintrag (siehe Kasten “Netzwerkkonfiguration”).

Legen Sie im Container via adduser User einen Benutzer an. Prüfen Sie danach mit der Eingabe von systemctl status sshd.service, ob der SSH-Server im Container läuft (Abbildung 3). Nun führen Sie von einem weiteren Terminal aus einen Login-Versuch mit ssh User@Container durch. Nach der Frage mit dem neuen SSH-Schlüssel sollte der Login auf die Shell nun klappen. Mittels exit melden Sie sich wieder ab.

Abbildung 3: Innerhalb des Containers prüfen Sie mit dem Kommando <code>systemctl</code> den Zustand des SSH-Daemons.

Abbildung 3: Innerhalb des Containers prüfen Sie mit dem Kommando systemctl den Zustand des SSH-Daemons.

Netzwerkkonfiguration

In den folgenden Beispielen aus dem Netz 192.168.0.0/24 verwenden wir für das Wirtssystem die IP-Adresse 192.168.0.37, für den Gast die 192.168.0.90 und den Containernamen debian8. Die entsprechenden Werte aus den Listings müssen Sie für die lokalen Gegebenheiten anpassen.

Listing 2 zeigt die Änderungen der Datei /etc/network/interfaces auf dem Wirt, außerdem ergänzen Sie für eine korrekte Namensauflösung die Datei /etc/hosts um die Zeile 192.168.0.90 debian8. Öffnen Sie danach vom Wirtssystem aus die Datei /var/lib/lxc/debian8/config, und ergänzen Sie diese um die Einträge aus Listing 3. Abschließend modifizieren Sie die Datei /var/lib/lxc/debian8/rootfs/etc/network/interfaces wie in Listing 4 gezeigt.

Die Einstellungen konfigurieren die Netzwerkkarte des Wirts als Bridge (br0 statt eth0). Der Container verfügt über ein virtuelles Ethernet-Interface (veth), das sich mit br0 verbindet.

Nach Abschluss der Änderungen starten Sie zunächst das Netzwerk auf dem Wirt mit dem Kommando /etc/init.d/networking restart neu, im Anschluss auch den Container. Dann testen Sie die Konfiguration mit einem Ping auf die Container-IP-Adresse. Zum Überprüfen der Namensauflösung geben Sie dabei den Hostnamen anstelle der IP-Adresse an.

Listing 2

iface eth0 inet manual
auto br0
iface br0 inet static
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0
  address 192.168.0.37
  netmask 255.255.255.0
  network 192.168.0.1
  broadcast 192.168.0.37
  gateway 192.168.0.1
  dns-nameservers 192.168.0.1
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 08/2016 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

1 Kommentar
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Holger
7 Jahre her

Das ist falsch:

address 192.168.0.37
netmask 255.255.255.0
network 192.168.0.1
broadcast 192.168.0.37
gateway 192.168.0.1
dns-nameservers 192.168.0.1

Richtig

network 192.168.0.0
broadcast 192.168.0.255

Falsch

address 192.168.0.90
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.90
gateway 192.168.0.1
dns-nameservers 192.168.0.1

Richtig

broadcast 192.168.0.255

Quellen

https://0fury.de/blog/?/post/Subnetting+f%C3%BCr+Anf%C3%A4nger/

http://www.itslot.de/2013/06/ipv4-netzwerkadresse-berechnen.html

Nach oben