Ich möchte hier kurz beschreiben wie man mit Standardmitteln „systemd“ einen Container erstellen kann. In meinen Test nutze ich als Host Manjaro Linux (Arch). Anreiz für dieses kleine Infoblatt ist das Linux Magazin. Für das herunterladen der Binary nutze ich debootstrap.
sudo pacman -S debootstrap
Zu erst muss das Grundsystem heruntergeladen werden.
sudo debootstrap --arch amd64 bullseye /nspawnd/containers/bullseye-1 https://debian.inf.tu-dresden.de/debian
oder für ubuntu
sudo debootstrap --arch amd64 focal /nspawnd/containers/fossa-1 http://de.archive.ubuntu.com/ubuntu
Damit man sich später auch anmelden kann an den Container muss in der /etc/securetty ein „pts/0“ stehen.
echo "pts/0" /nspawnd/containers/bullseye-1/etc/securetty
Der Container kann nun mit systemd-nspawn gestartet werden
sudo systemd-nspawn -D /nspawnd/containers/bullseye-1
Danach kann man gleich die Pakete aktualisieren.
apt update && apt upgrade
Die Datei /etc/hostname sollte im Container gelöscht werden, damit nur der Name von nspanw genutzt wird.
Des Weiteren sollte im Container DBus installiert sein, damit es über machinectl genutzt werden kann.
apt install dbus
So, fertig ist unsere Template um jetzt eine neuen Container zu erstellen muss der Inhalt in einen neuen Ordner kopiert werden.
sudo cp -R bullseye-1/* template/bullseye/
sudo cp -R template/bullseye/* /var/lib/machines/webserver-1
Um jetzt zum Beispiel einen neuen Container zu starten macht man folgendes.
sudo systemd-nspawn -M webserver-1 -b -D /var/lib/machines/webserver-1
| M | gibt denNamen an |
| b | boot sucht automatisch die ini |
| D | Directory das Verzeichnis wo es gestartet werden soll |
Ich habe jetzt in meinen Beispiel ein nginx installiert auf den Container webserver-1.
Fertig ist ein nginx Container. Die Netzwerkkonfiguration speichere ich mit in eine nspawn File.
#/etc/systemd/nspawn/webserver-1.nspawn
[Exec]
PrivateUsers=pick
[Network]
Port=tcp:80:80
[Files]
PrivateUsersChown=yes
Leider funktioniert dies in Manjaro nicht !! Somit steht weiter unten eine Unit über .service die funktioniert.
Danach kann der Container über machinectl gesteuert werden.
machinectl start webserver-1
Der nspawn kann dann über eine Service Unit in /etc/systemd/system/webservice-1.service vereinfacht werden.
[Unit]
Description=webserver-1
[Service]
LimitNOFILE=100000
ExecStart=/usr/bin/systemd-nspawn -M webserver-1 -b -D /var/lib/machineswebserver-1
Restart=always
[Install]
Also=dbus.service
So das war der einfach Weg jetzt kommt noch ein Beispiel mit Images, da ich recht Faul bin, habe ich das Tool mkosi genutzt und wir eine Konfigurationsdatei angelegt mkosi.default
[Distribution]
Distribution=ubuntu
Release=focal
[Output]
Format=gpt_ext4
Bootable=yes
Output=focal-image.raw
[Packages]
Packages=
vim
openssh-client
python3
[Validation]
Password=xxxxxxx
und mit dem aufruf mkosi in dem Verzeichnis wird ein .raw Image erstellt. Aus diesem Image kann man dnn Problem los einen Container starten.
sudo systemd-nspawn -M python -i /var/lib/machines/focal-image.raw -b --bind /mein_skript_verzeichnis/:/root/skripte
Hier nun ein weiteres Beispiel für Firefox.
Neueste Kommentare