Ich mach jetzt auch Container

Aber Docker ist es nicht. Da war mir doch zu viel Trubel drum und so richtig Vorteile hat es ja nicht, denn unter jedem Docker liegt noch ein Betriebssystem, was man hegen und pflegen muss. Seine Anwendung muss man dann auch noch ausnanderzergeln

Posted by eumel8 on May 08, 2016 · 5 mins read

Aber Docker ist es nicht. Da war mir doch zu viel Trubel drum und so richtig Vorteile hat es ja nicht, denn unter jedem Docker liegt noch ein Betriebssystem, was man hegen und pflegen muss. Seine Anwendung muss man dann auch noch ausnanderzergeln, ‘dockerizieren’. Aufmerksamgeworden bin ich bei Canonical auf LXD
LXD 2.0 heisst der neue Stern am Virtualisierungshimmel. Erst gabs die Paravirtualisierung mit Vmware und Xen, dann die Hardware-Accelerator mit KVM und VirtualBox und jetzt LXD. LXD verspricht vollstaendige Hardwareemulation vom Hostsystem ohne Geschwindigkeitsnachteile, die eine Virtualisierung sonst mitbringt. Sehr kurze Bootzeiten unter einer Sekunde. Eine sehr hohe Packungsdichte von etlichen hundert oder gar tausenden Systemen auf einem Rechner mit vollstaendiger Isolierung, also einer sehr hohen Systemsicherheit auf Netzwerk und Betriebssystemebene. Und die Moeglichkeit der Live-Migration von einem zu einem anderen Host. Schauen wir uns das mal an: Am besten startet man mit der neuen LTS-Version von Ubuntu, in der LXD schon mit ausgeliefert wird.

Mit lxd init beginnt man mit der Initialisierung seines Systems. Erst werden einige Fragen zu Dateisystem und Netzwerkanbindung gestellt. Das Netzwerk brauch eine Bridge und bedienen laesst sich LXD ueber eine API, die praktischerweise auch ueber Netzwerk erreichbar sein sollte. DIe Verbindung ist automatisch verschluesselt, Zertfikate werden automatisch erstellt und man brauch sich nicht drum zu kuemmern. Bei der Frage nach dem Dateisystem (dir or zfs) sollte man ZFS nehmen. ZFS, das ist jetzt fuer Leute, die SUN nicht nur fuer eine Tageszeitung halten, hat hier tatsaechlich ein Remake erlebt. Das Dateisystem wird verwendet, um Snapshots der Container machen zu koennen, um die dann auf andere Hosts zu migrieren. Alternativen sind noch LVM, BTRFS oder XFS, favorisiert wird aber tatsaechlich ZFS. Installieren kann man es mit

apt install criu
apt install zfsutils-linux

Das Criu ist fuer das Erstellen der Snapshots zustaendig und ZFS fuer das Abspeichern.

In der ausgelieferten Version von LXD sind schon ein paar Repositories fuer Container eingebunden. So kann man recht einfach einen Ubuntu-Container erstellen:

lxc image list ubuntu:
lxc launch ubuntu:16.04 c1
lxc exec c1 bash

lxc ist praktisch das Command-Line-Tool, um auf den von lxd bereitgestellte API zuzugreifen. Ich kann mir die Liste der bereitgestellten Images anschauen, einen Container c1 davon erstellen und in diesem Container die bash-Shell aufrufen. Praktischerweise ist ein NAT auf dem Hostsystem eingerichtet, sodass man jetzt im Container Dinge installieren kann.

Sowas funktioniert dann zum Beispiel:


apt-get -y install git apache2 libapache2-mod-php5 php-sqlite3 sqlite3 php-xml
git clone https://github.com/eumel8/ebook-wunschliste.git /var/www/html/ebooks
chown www-data:www-data /var/www/html/ebooks
sed -i -e "s/^\$AWSSecretKey.*/\$AWSSecretKey='4ZjsdHDheLDJe87jdhDHlJhwksjshe2DDhw98';/" /var/www/html/ebooks/index.php
sed -i -e "s/^\$AWSAccessKeyId.*/\$AWSAccessKeyId='AKHSZEGJSH72JDHSK';/" /var/www/html/ebooks/index.php
sed -i -e "s/^\$AssociateTag.*/\$AssociateTag='ebookswishlist-21';/" /var/www/html/ebooks/index.php
service apache2 restart

Um unsere Webseite von der Aussenwelt auch erreichbar zu machen, brauch es wieder ein paar iptables Regeln:

iptables -t nat -A POSTROUTING -j MASQUERADE
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.104 --dport 80 -j DNAT --to-destination 10.21.37.51:80

192.168.0.104 ist unser Hostsystem, auf dem LXD laeuft 10.21.37.51 ist der Container mit unseren kleinen Webapplikation Kann sein, dass es schon Bordmittel in lxc gibt, aber ich habe bis dato nichts gefunden.

Was ich auch nicht gleich gefunden hatte, waren Container-Templates von anderen Betriebssystemen. Da hilft ein

lxc remote add containerhub https://images.linuxcontainers.org/ --public

um zum Beispiel ein OpenSuse 13.2 starten zu koennen oder andere Betriebssysteme. Wie geht das jetzt mit Live-Migration? Dazu brauchen wir einen zweiten Host mit Ubuntu 16.04. Wenn wir eine VM haben, kann man die einfach clonen. Verwiesen sei aber dazu auf diesen Bug, wo es Probleme offenbar mit KVM gibt. Snapshots kann man jederzeit von einem Container anlegen, entweder mit Systemstatus oder ohne (stateful/stateless). Letzteres funktioniert immer, stateful muss man testen:

lxc snapshot c1 --stateful

Den zweiten LXD-Host bindet man mit folgendem Befehl in sein System ein:

lxc remote add zwei 192.168.0.105

Verschoben wird der Container dann so:

lxc move c1 zwei:

Fertig!

bash lxc list zwei: `

Dort sollte jetzt der Container zu sehen sein.

Wie man sieht, ist die Sache recht simpel und vielleicht deswegen auch recht genial. Informationen findet man auf https://linuxcontainers.org/ und eine sehr umfangreiche Beschreibung im Blog des Entwicklers https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/

Happy Container!