GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Hinter den Kulissen mit Linux-Containern

Können Sie Linux-Container ohne Docker haben? Ohne OpenShift? Ohne Kubernetes?

Ja, du kannst. Jahre bevor Docker Container zu einem Haushaltsbegriff machte (das heißt, wenn Sie in einem Rechenzentrum leben), entwickelte das LXC-Projekt das Konzept, eine Art virtuelles Betriebssystem auszuführen, das denselben Kernel nutzt, aber enthalten innerhalb definierter Gruppen von Prozessen.

Docker baute auf LXC auf, und heute gibt es viele Plattformen, die die Arbeit von LXC sowohl direkt als auch indirekt nutzen. Die meisten dieser Plattformen machen das Erstellen und Verwalten von Containern denkbar einfach, und für große Bereitstellungen ist es sinnvoll, solche spezialisierten Dienste zu verwenden. Allerdings verwaltet nicht jeder eine große Bereitstellung oder hat Zugriff auf große Dienste, um mehr über die Containerisierung zu erfahren. Die gute Nachricht ist, dass Sie Container mit nichts weiter als einem PC mit Linux und diesem Artikel erstellen, verwenden und erlernen können. Dieser Artikel wird Ihnen helfen, Container zu verstehen, indem er sich LXC ansieht, wie es funktioniert, warum es funktioniert und wie Sie Fehler beheben können, wenn etwas schief geht.

Die Einfachheit umgehen

Linux-Container

  • Was sind Linux-Container?
  • Eine Einführung in die Containerterminologie
  • Download:Einführung in Container
  • Kubernetes-Operatoren:Automatisierung der Container-Orchestrierungsplattform
  • eBook:Kubernetes-Muster zum Entwerfen cloudnativer Apps
  • Was ist Kubernetes?

Wenn Sie nach einer Kurzanleitung für LXC suchen, besuchen Sie die hervorragende Linux Containers Website.

Installation von LXC

Wenn es noch nicht installiert ist, können Sie LXC mit Ihrem Paketmanager installieren.

Geben Sie bei Fedora oder ähnlichem Folgendes ein:

$ sudo dnf install lxc lxc-templates lxc-doc

Geben Sie unter Debian, Ubuntu und ähnlichen Systemen Folgendes ein:

$ sudo apt install lxc

Erstellen einer Netzwerkbrücke

Die meisten Container gehen davon aus, dass ein Netzwerk verfügbar ist, und die meisten Container-Tools erwarten, dass der Benutzer virtuelle Netzwerkgeräte erstellen kann. Die grundlegendste Einheit, die für Container erforderlich ist, ist die Netzwerkbrücke, die mehr oder weniger das Softwareäquivalent eines Netzwerkswitches ist. Ein Netzwerk-Switch ist ein bisschen wie ein intelligenter Y-Adapter, der verwendet wird, um eine Kopfhörerbuchse aufzuteilen, sodass zwei Personen mit separaten Headsets dasselbe hören können, außer dass ein Netzwerk-Switch anstelle eines Audiosignals Netzwerkdaten überbrückt.

Sie können Ihre eigene Software-Netzwerkbrücke erstellen, damit Ihr Hostcomputer und Ihr Container-Betriebssystem unterschiedliche Netzwerkdaten über ein einziges Netzwerkgerät (entweder Ihren Ethernet-Port oder Ihre Wireless-Karte) senden und empfangen können. Dies ist ein wichtiges Konzept, das oft verloren geht, wenn Sie die manuelle Erstellung von Containern abgeschlossen haben, denn unabhängig von der Größe Ihrer Bereitstellung ist es höchst unwahrscheinlich, dass Sie für jeden von Ihnen ausgeführten Container eine dedizierte physische Netzwerkkarte haben. Es ist wichtig zu verstehen, dass Container mit virtuellen Netzwerkgeräten kommunizieren, damit Sie wissen, wo Sie mit der Fehlerbehebung beginnen müssen, wenn ein Container seine Netzwerkverbindung verliert.

Um eine Netzwerkbrücke auf Ihrem Computer zu erstellen, müssen Sie über die entsprechenden Berechtigungen verfügen. Verwenden Sie für diesen Artikel das sudo Befehl, um mit Root-Rechten zu arbeiten. (Die LXC-Dokumentation bietet jedoch eine Konfiguration, um Benutzern die Berechtigung zu erteilen, dies zu tun, ohne sudo zu verwenden .)

$ sudo ip link add br0 type bridge

Überprüfen Sie, ob die imaginäre Netzwerkschnittstelle erstellt wurde:

$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
   noop state DOWN group default qlen 1000
   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff

Seit br0 als Netzwerkschnittstelle angesehen wird, benötigt es eine eigene IP-Adresse. Wählen Sie eine gültige lokale IP-Adresse aus, die nicht mit einer vorhandenen IP-Adresse in Ihrem Netzwerk in Konflikt steht, und weisen Sie sie br0 zu Gerät:

$ sudo ip addr add 192.168.168.168 dev br0

Stellen Sie schließlich sicher, dass br0 läuft:

$ sudo ip link set br0 up

Festlegen der Containerkonfiguration

Die Konfigurationsdatei für einen LXC-Container kann so komplex sein, wie sie sein muss, um den Platz eines Containers in Ihrem Netzwerk und dem Hostsystem zu definieren, aber für dieses Beispiel ist die Konfiguration einfach. Erstellen Sie eine Datei in Ihrem bevorzugten Texteditor und definieren Sie einen Namen für den Container und die erforderlichen Einstellungen des Netzwerks:

lxc.utsname = opensourcedotcom
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 192.168.168.1/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596

Speichern Sie diese Datei in Ihrem Home-Verzeichnis als mycontainer.conf .

Der lxc.utsname ist willkürlich. Sie können Ihren Container nennen, wie Sie möchten; Es ist der Name, den Sie beim Starten und Stoppen verwenden.

Der Netzwerktyp ist auf veth eingestellt , das ist eine Art virtuelles Ethernet-Patchkabel. Die Idee ist, dass die veth Die Verbindung geht vom Container zum Bridge-Gerät, das durch lxc.network.link definiert wird -Eigenschaft auf br0 gesetzt . Die IP-Adresse für den Container befindet sich im selben Netzwerk wie das Bridge-Gerät, ist jedoch eindeutig, um Kollisionen zu vermeiden.

Mit Ausnahme der veth Netzwerktyp und oben Netzwerk-Flag, erfinden Sie alle Werte in der Konfigurationsdatei. Die Liste der Eigenschaften ist unter man lxc.container.conf verfügbar . (Wenn es auf Ihrem System fehlt, suchen Sie in Ihrem Paketmanager nach separaten LXC-Dokumentationspaketen.) Es gibt mehrere Beispielkonfigurationsdateien in /usr/share/doc/lxc/examples , die Sie sich später ansehen sollten.

Starten einer Container-Shell

An diesem Punkt haben Sie zwei Drittel des Weges zu einem funktionsfähigen Container geschafft:Sie haben die Netzwerkinfrastruktur und Sie haben die imaginären Netzwerkkarten in einem imaginären PC installiert. Jetzt müssen Sie nur noch ein Betriebssystem installieren.

Aber selbst in diesem Stadium können Sie LXC bei der Arbeit sehen, indem Sie eine Shell in einem Containerbereich starten.

$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#

Sehen Sie sich in diesem sehr nackten Container Ihre Netzwerkkonfiguration an. Es sollte Ihnen vertraut und dennoch einzigartig erscheinen.

# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state [...]
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[...]
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> [...] qlen 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
   valid_lft forever preferred_lft forever
[...]

Ihr Container ist sich seiner gefälschten Netzwerkinfrastruktur und eines vertrauten, aber einzigartigen Kernels bewusst.

# uname -av
Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Verwenden Sie den Ausgang Befehl zum Verlassen des Containers:

# exit

Installation des Container-Betriebssystems

Der Aufbau einer vollständig containerisierten Umgebung ist viel komplexer als die Netzwerk- und Konfigurationsschritte, sodass Sie eine Containervorlage von LXC ausleihen können. Wenn Sie keine Vorlagen haben, suchen Sie in Ihrem Software-Repository nach einem separaten LXC-Vorlagenpaket.

Die standardmäßigen LXC-Vorlagen sind unter /usr/share/lxc/templates verfügbar .

$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud

Wählen Sie Ihren Favoriten aus und erstellen Sie dann den Container. Dieses Beispiel verwendet Slackware.

$ sudo lxc-create --name slackware --template slackware

Zuzusehen, wie eine Vorlage ausgeführt wird, ist fast so lehrreich, wie eine von Grund auf neu zu erstellen; es ist sehr ausführlich und Sie können das lxc-create sehen setzt das "Stammverzeichnis" des Containers auf /var/lib/lxc/slackware/rootfs und mehrere Pakete werden heruntergeladen und in diesem Verzeichnis installiert.

Wenn Sie die Vorlagendateien durchlesen, erhalten Sie eine noch bessere Vorstellung davon, worum es geht:LXC richtet einen minimalen Gerätebaum, gemeinsame Spool-Dateien, eine Dateisystemtabelle (fstab), Init-Dateien und so weiter ein. Es verhindert auch, dass einige Dienste, die in einem Container keinen Sinn machen (wie udev für die Hardwareerkennung), gestartet werden. Da die Vorlagen ein breites Spektrum typischer Linux-Konfigurationen abdecken, ist es ratsam, Ihre Arbeit auf eine Vorlage zu stützen, die dem, was Sie einrichten möchten, am nächsten kommt, wenn Sie beabsichtigen, Ihre eigene zu entwerfen. Andernfalls werden Sie sicher Auslassungsfehler machen (wenn nichts anderes), über die das LXC-Projekt bereits gestolpert ist und die berücksichtigt wurden.

Sobald Sie die minimale Betriebssystemumgebung installiert haben, können Sie Ihren Container starten.

$ sudo lxc-start --name slackware \
--rcfile ~/mycontainer.conf

Sie haben den Container gestartet, aber nicht daran angehängt. (Im Gegensatz zum vorherigen grundlegenden Beispiel führen Sie dieses Mal nicht nur eine Shell aus, sondern ein containerisiertes Betriebssystem.) Fügen Sie es namentlich hinzu.

$ sudo lxc-attach --name slackware
#

Überprüfen Sie, ob die IP-Adresse Ihrer Umgebung mit der in Ihrer Konfigurationsdatei übereinstimmt.

# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0

Verlassen Sie den Container und fahren Sie ihn herunter.

# exit
$ sudo lxc-stop slackware

Reale Container mit LXC ausführen

Im wirklichen Leben macht es LXC einfach, sichere Container zu erstellen und auszuführen. Container haben seit der Einführung von LXC im Jahr 2008 einen langen Weg zurückgelegt, also nutzen Sie das Know-how der Entwickler zu Ihrem Vorteil.

Während die LXC-Anweisungen auf linuxcontainers.org den Prozess einfach machen, soll Ihnen diese Tour durch die manuelle Seite der Dinge helfen zu verstehen, was hinter den Kulissen vor sich geht.


Linux
  1. Planen Sie eine Aufgabe mit dem Linux-Befehl at

  2. Analysieren Sie den Linux-Kernel mit ftrace

  3. Rechnen Sie in der Linux-Shell mit GNU bc

  4. Verwalten Sie Netzwerkverbindungen über die Linux-Befehlszeile mit nmcli

  5. Gedanken zur Überwachung von Dateiänderungen mit Linux über das Netzwerk

Machen Sie Linux mit Firewalls stärker

Lernen Sie Linux mit dem Raspberry Pi

Network Manager unter Linux mit Beispielen

Werfen Sie einen Blick hinter die Kulissen mit einer Postman-Installations- und Anleitung

Sichern Sie Linux mit der Sudoers-Datei

So legen Sie ein externes Netzwerk für Container in Linux-Containern (LXC) fest