Donnerstag, 16. Mai 2024

Containern - Testumgebung

aber diesmal mit viel mehr Tiefe. 😉

Ich bin ein Fan von Virtualisierung, habe mich schon mit Containern (docker) beschĂ€ftigt und habe irgendwann von LXC gelesen. 

Ubuntu wirbt mit LXD, seit ein paar Monaten gibt es einen Fork von LXD mit dem Namen Incus. - was verbirgt sich dahinter? UrsprĂŒnglich wollte ich auf einem Host Libvirt und LXC parallel betreiben und die Möglichkeit fĂŒr Docker haben.

Ich meine, ich habe nach einigen Wochen lesen folgendes verstanden: Virtualisierung emuliert und isoliert Hardware und schafft eine Umgebung fĂŒr jedes OS, LXC schafft eine isolierte Linux System Umgebung, Docker schafft eine isolierte Linux Applikationsumgebung, LXD ist eine Verwaltungsumgebung fĂŒr LXC. Der Unterschied zwischen LXC und docker Container: fĂŒr den Anwender ist docker eine Black Box, die Applikation wird vom Entwickler gewartet und vom Anwender angewendet. LXC ist fĂŒr den Anwender ein "fertiges" Linux System in dem er seine Applikation installieren und es warten muss.

Was mich eine Weile verwirrt hat: FĂŒr LXC gibt es 2 (oder mehr?) Verwaltungssysteme: lxc-utils und LXD. Bei LXD heißt das fĂŒhrende Verwaltungskommando lxc. WĂ€hrend ich immer weiterlese, beschleicht mich das ungute GefĂŒhl, dass es alles Schnee von gestern wird, was ich hier aufschreibe.

Testumgebung

Ich schaffe mir eine virtuelle Testumgebung, spÀter könnte der virtuelle Host auch der physische sein. So soll die Testumgebung aussehen, wenn sie fertig ist.


Es scheint jede Kombination und Verschachtelung von Virtualisierung möglich, ich habe dazu verschiedene Anleitungen und Empfehlungen gefunden. Die parallele Installation von LXC und Docker wird wohl netzwerktechnisch anspruchsvoll. Docker im LXC Container sieht man hÀufig. Mal schauen wie ich spÀter meine produktive Umgebung aufbaue.

Virtuelle Maschine installieren

Ich betrachte die virtuelle Maschine als Host fĂŒr die Container und verbinde sie direkt mit dem Netzwerk und nicht mit dem NAT Interface von libvirt. (Option --network)

Installation ĂŒber die Konsole auf einem libvirt Host.

name=container-vm
cdrom='/mnt/data-shares/ISO/ubuntu-22.04.4-live-server-amd64.iso'
virt-install\
    --name ${name} \
    --memory 4096 --vcpus 4 --graphics none --network bridge=br0 \
    --disk size=20 \
    --location ${cdrom} \
    --console pty,target_type=serial --extra-args 'console=ttyS0'

Am Ende der Installation kann man von einer zweiten Host Konsole die "CD" auswerfen und mit Enter den Neustart auslösen. Dabei bleibt die ttyS0 console verbunden und man kann nach dem Neustart mit dem Login weitermachen. 

virsh change-media container-vm sda --eject

Will man die (serielle) Installations-Konsole beenden funktioniert das mit deutscher Tastatur mit der Kombination ctrl+5 .

Um Backups und Snapshots ordentlich anzufertigen, muss der qemu-guest-agent aktiv sein. In ubuntu installiert man ihn nach, in debian ist er nach dem Setup schon aktiv.

sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent

Jetzt kann man zu beliebigen Zeitpunkten einen Snapshot setzen und bei den Test auch wieder zurĂŒck gehen.

Hat man bei der Ubuntu Installation den Standard gewÀhlt, wird lvm nur die HÀlfte des Systemvolume verwenden und bei nÀchsten Versuchen wird der Platz knapp.

sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv -r

Damit wird das Volume auf den vollen Platz erweitert.

LXD einrichten

LXD ist im Ubuntu Server installiert und muss nur initialisiert werden. Man kann alle Fragen mit Standardwerten (enter) beantworten. Man kann lxd init als User oder mit root Rechten ausfĂŒhren (ich habe es bisher nur als User gemacht). Weitere Informationen.

lxd init

Anmerkung: Man kann eine Web UI einrichten. Mir war das Ergebnis zu wenig und der Weg dahin zu undurchsichtig. Ich konzentriere mich erstmal auf die Verwaltung mit der Kommandozeile.

Das Kommando lxd hat noch weiter Kommandos - Es gibt fĂŒr lxd und lxc eine intuitive Hilfe: an fast jeder Stelle kann man hinten --help anhĂ€ngen.

LXC Kommando

LXC ist das  "LXD"- Kommando zur Steuerung der Container.  Die wichtigsten hier verwendeten Befehle sind start, stop, config, storage, shell, exec.

CONTAINER=demo
lxc launch ubuntu:22.04 ${CONTAINER}

Um interaktive in den Container zu steigen, verwendet man eines dieser beiden Kommandos. 

lxc exec ${CONTAINER} sh
lxc shell ${CONTAINER}

Die erste Version funktioniert eventuell immer, die zweite nur Containern mit bash. Mit exit kann man diese Shell wieder verlassen.

Man kann Befehle im Container direkt mit exec ausfĂŒhren und kehrt danach zurĂŒck zum Host. Je nach Befehl muss man noch diese mit -- oder -- sh -c "Befehl" abtrennen.

lxc exec ${CONTAINER} cat /etc/os-release
lxc exec ${CONTAINER} -- ls -lha
lxc exec ${CONTAINER} -- sh -c "cd /tmp ; pwd"

Die Testumgebung soll noch fĂŒr docker vorbereitet werden.

LXC Container fĂŒr Docker einrichten

Die Installation von docker in einem lxc Container ist hier komplett beschrieben. Etwas unvermittelt gerĂ€t man durch die Installation von docker schon etwas in die Feinkonfiguration und Verwaltung von LXC Containern.

Docker arbeitet nicht gut mit dem zfs Filesystem zusammen, deshalb wird ein btrfs Storage Pool erzeugt, ein Container 'docker' erzeugt und diesem ein Volume fĂŒr seinen Pfad /var/lib/docker zugeordnet.

CONTAINER=docker
lxc launch ubuntu:22.04 ${CONTAINER}
lxc storage create pool_b btrfs
lxc storage volume create pool_b vol_1
lxc config device add ${CONTAINER} dev_d1 disk pool=pool_b source=vol_1 path=/var/lib/docker

Noch ein paar Konfigurationen und nach einem Neustart ist der Container fertig.

lxc config set ${CONTAINER} \
   security.nesting=true \
   security.syscalls.intercept.mknod=true \
   security.syscalls.intercept.setxattr=true
lxc restart ${CONTAINER}

Als letzter Schritt fĂŒr die Testumgebung:

Docker installieren

Die komplette und aktuelle Installationsbeschreibung steht in der Docker Dokumentation und die Schritt fĂŒr Schritt Variante in dem oben genannten Ubuntu Tutorial.

Zugriff auf die Konsole des Containers, danach installieren wir docker. 

lxc shell ${CONTAINER}

Ich habe mich fĂŒr die Variante mit dem komfortablen Script entschieden, fĂŒr Testumgebungen empfohlen. Man könnte vorher auch einen Benutzer erzeugen um docker nicht als root laufen zu lassen.

curl -sSL https://get.docker.com | sh

Zum Test kann man einen docker Container starten.

docker run hello-world

Damit ist die Systemkonfiguration abgeschlossen und die Testumgebung steht. 

Was haben wir jetzt installiert? 

Die anfangs gezeigte Testumgebung steht und wir befinden uns im Container "docker". Ein kurzer Blick:

docker info
docker images
docker ps -a

Mit exit verlassen wir diesen Container und befinden uns auf der virtuellen Maschine. Wir lassen uns nochmal die LXD Umgebung anzeigen:

lxc list
lxd init --dump

Im nÀchsten Teil will ich den praktischen Umgang mit LXD aufschreiben.

ToDo

Codebox zum kopieren

Code

Leerzeile

Linkliste

https://discussion.scottibyte.com/latest

https://documentation.ubuntu.com/lxd

https://documentation.ubuntu.com/lxd/en/latest/storage/

https://linuxcontainers.org/lxd/

https://www.virtualizationhowto.com/2024/01/lxc-vs-docker-pros-and-cons-explained/

Keine Kommentare:

Kommentar veröffentlichen