Inhalte
Linuxcontainer und der Container-Hypervisor LXD sind elemantare Tools, die jeder Adminsitrator kennen sollte. Mithilfe von Containern, kann man sowohl eigene Umgebungen für Programmen, als auch für komplette Betriebssystemen erstellen. So ist man in der Lage abgeschotte Container zu erstellen. Hier eine kleine Anleitung:
Voraussetzungen
- Ubuntu 18.04 LTS
- sudo rechte oder root
- IP Adressen /24 oder /32
Um LXD zu benutzen, müssen wir es ersteinmal per APT installieren. Folgendes Befehl genügt schon aus. Wichtig ist zu wissen, dass wir auch die zfs Tools brauchen. Dies installeiren wir gleich mit.
sudo apt install zfsutils-linux sudo apt install lxd
Nach der Installation erstellen wir unser Profil. Profile werden benutzt, um standardeigenschaften zu definieren. Wir rufen hierfür ein initialscript auf:
sudo lxd init
Hier können wir alle Fragen mit einem [Enter] bestätigen. [Enter] = default Antwort. Am Ende sind wir schon soweit. Wir können nun ein ersten Container bauen. Jedoch testen wir LXC/LXD mit einem list befehl.
lxc list
Sollten wir folgende Antwort sehen, ist LXD voll einsatzbereit.
Generating a client certificate. This may take a minute... If this is your first time using LXD, you should also run: sudo lxd init To start your first container, try: lxc launch ubuntu:16.04 +------+-------+------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+-------+------+------+------+-----------+
Nun erstellen wir ein Ubuntu LXC:
lxc launch ubuntu:18.04 <containernamen>
<containernamen> ersetzen wir mit einem beliebigen namen. Standardmäßig wird nun eine internen 10er IPv4 Adresse dem Container vergeben. Um dem Container eine feste IPv4 Adresse zu vergeben, werden wir nun eine Netzwerkbrige auf dem Host erstellen. Folgene Konfiguration geht davon aus, dass der Host nur eine physical Netzwerkkarte besietzt und dies mit eth0 benannt worden ist.
Auf dem Hostsystem
Wir gehen in unser Netzplan oder interface und erstellen nun eine Bridge:
auto br0 iface bro0 inet static address 192.168.100.125/24 gateway 192.168.100.1 dns-nameservers 8.8.8.8 8.8.4.4 bridge_ports eth0 bridge_fd 5 bridge_stp yes
wenn netplan verwendet wird, sieht die konfiguration wie folgt aus:
# This file is generated from information provided by # the datasource. Changes to it will not persist across an instance. # To disable cloud-init's network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} network: ethernets: enth0: dhcp4: no version: 2 bridges: br0: dhcp4: no addresses: [192.168.100.125/24] gateway4: 192.168.100.1 nameservers: addresses: [8.8.8.8,8.8.4.4] interfaces: [eth0]
nun mit einem netplan applay die Netzwerkkonfiguration aktivieren. Ggf. mit einem netplan –debug apply überprüfen.
Nun hat unser Host die feste IP Adresse: 192.168.100.125
Dem Container eine feste IP Adresse zuordnen
Nachdem wir unserem Host eine feste Ip Adresse vergeben haben und dabei noch eine Bridge erstellt haben, fügen wir nun einem Container eine neue Netzwerkkarte hinzu. Dabei gilt.
parent=Host Bridge namen
name=dem im Container simulierte Netzwerkkarte
lxc config device add <containernamen> eth0 nic nictype=bridged parent=br0 name=eth0
Nun loggen wir uns in den Container per Bash ein:
lxc exec <containernamen> bash
und könenn ein neustart versuchen:
reboot
Nachdem reboot können wir uns die liste wieder aufrufen: lxc list
Dort sollte nun der Contaienr mit der IP Adresse zu sehen sein.
Ubuntu IP Adresse vergeben
Nun vergeben wir dem Container eien feste IP Adresse hinzu:
Bei Ubuntu ab Version 18.04 zum Netplan:
sudo nano /etc/netplan/50-cloud-init.yaml
Standardmäßig wird hier per DHCP eine Ip Adresse geholt. Deshalb sieht die Standardkonfiguration wie folgt aus:
# This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: yes
Wir ändern die Konfiguration und geben dem Container eine feste IP Adresse an:
# This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: no addresses: [192.168.1.110/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8,8.8.4.4]
Nun Speichern und aktivieren
sudo netplan apply
Bei einer Fehlermeldung könnten wir nochmals ein –debug anfügen, um mehr Inforamtionen zur Fehlermeldung zu bekommen.
sudo netplan --debug apply
Nützliche Befehle
#Übersicht aller Container lxc list #Snapshot erstellen lxc snapshot <containernamen> #Restore eines snaps lxc restore <containernamen> snap0 #Aus einem Snap ein neuen Contaienr erstellen lxc copy <containernamen>/snap0 <neuer_containernamen> #Bridged anschauen brctl show
Weitere nützliche Befehle
Aus Container, ein Template erstellen:
Variante 1:
lxc launch ubuntu:14.04 <containernamen> lxc exec <containernamen> bash <do whatever change you want> lxc publish <containernamen> --alias <name_of_template>
Variante 2:
sudo apt install debootstrap mkdir /tmp/<name_of_template> sudo debootstrap sid /tmp/<name_of_template> sudo chroot /tmp/<name_of_template> <do whatever change you want> exit #Create Rootf Data sudo tar -cvzf rootfs.tar.gz -C /tmp/<name_of_template> . #Create metadata.yaml nano metadate.yaml >> architecture: "x86_64" creation_date: 1458040200 # To get current date in Unix time, use `date +%s` command properties: architecture: "x86_64" description: "Debian Unstable (sid) with preconfigured Node.js repository (20171227)" os: "debian" release: "sid" <<EOF #Create Tar GZ of Metadata tar -cvzf metadata.tar.gz metadata.yaml #Import LXD Image lxc image import metadata.tar.gz rootfs.tar.gz --alias <name_of_template_alias> #Start Container lxc launch <name_of_template_alias> <containernamen>