In früheren Artikeln habe ich über Container-Images und Laufzeiten geschrieben. In diesem Artikel schaue ich mir an, wie Container durch eine Grundlage einiger spezieller Linux-Technologien, einschließlich Namespaces und Kontrollgruppen, ermöglicht werden.
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?
Linux-Technologien bilden die Grundlage für das Erstellen und Ausführen eines Containerprozesses auf Ihrem System. Zu den Technologien gehören:
- Namespaces
- Kontrollgruppen (cgroups)
- Seccomp
- SELinux
Namespaces
Namespaces bieten eine Isolationsebene für die Container, indem sie dem Container eine Ansicht dessen geben, was sein eigenes Linux-Dateisystem zu sein scheint. Dies schränkt ein, was ein Prozess sehen kann, und schränkt daher die ihm zur Verfügung stehenden Ressourcen ein.
Es gibt mehrere Namespaces im Linux-Kernel, die von Docker oder Podman und anderen beim Erstellen eines Containers verwendet werden:
$ docker container run alpine ping 8.8.8.8
$ sudo lsns -p 29413
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --
switched...
4026533105 mnt 1 29413 root ping 8.8.8.8
4026533106 uts 1 29413 root ping 8.8.8.8
4026533105 ipc 1 29413 root ping 8.8.8.8
[...]
Benutzer
Der Benutzernamensraum isoliert Benutzer und Gruppen innerhalb eines Containers. Dies geschieht, indem Containern im Vergleich zum Hostsystem eine andere Ansicht der UID- und GID-Bereiche ermöglicht wird. Der Benutzernamensraum ermöglicht es der Software, innerhalb des Containers als Root-Benutzer ausgeführt zu werden. Wenn ein Eindringling den Container angreift und dann auf den Host-Rechner flüchtet, ist er nur auf eine Nicht-Root-Identität beschränkt.
Mnt
Der mnt-Namespace ermöglicht es den Containern, ihre eigene Sicht auf die Dateisystemhierarchie des Systems zu haben. Sie finden die Einhängepunkte für jeden Containerprozess in /proc/
UTS
Der Namespace des Unix Timesharing System (UTS) ermöglicht es Containern, einen eindeutigen Hostnamen und Domänennamen zu haben. Wenn Sie einen Container ausführen, wird eine zufällige ID als Hostname verwendet, selbst wenn Sie den — name
verwenden Schild. Sie können den unshare
verwenden Befehl, um eine Vorstellung davon zu bekommen, wie das funktioniert.
$ docker container run -it --name nived alpine sh
/ # hostname
9c9a5edabdd6
/ #
$ sudo unshare -u sh
# hostname isolated.hostname
# hostname
# exit
$ hostname
homelab.redhat.com
IPC
Der Inter-Process Communication (IPC)-Namespace ermöglicht verschiedenen Containerprozessen die Kommunikation, indem sie auf einen gemeinsam genutzten Speicherbereich zugreifen oder eine gemeinsam genutzte Nachrichtenwarteschlange verwenden.
# ipcmk -M 10M
Shared memory id: 0
# ipcmk -M 20M
Shared memory id: 1
# ipcs
---- Message Queues ----
key msqid owner perms used-bytes messages
---- Shared Memory Segments
key shmid owner perms bytes nattch status
0xd1df416a 0 root 644 10485760 0
0xbd487a9d 1 root 644 20971520 0
[...]
PID
Der Process ID (PID)-Namespace stellt sicher, dass die Prozesse, die in einem Container ausgeführt werden, von der Außenwelt isoliert sind. Wenn Sie ein ps
ausführen Befehl innerhalb eines Containers, sehen Sie aufgrund dieses Namespace nur die Prozesse, die innerhalb des Containers und nicht auf dem Hostcomputer ausgeführt werden.
Netz
Der Netzwerk-Namespace ermöglicht dem Container, eine eigene Ansicht von Netzwerkschnittstellen, IP-Adressen, Routing-Tabellen, Portnummern usw. zu haben. Wie kann ein Container mit der Außenwelt kommunizieren? Alle von Ihnen erstellten Container werden zur Kommunikation an eine spezielle virtuelle Netzwerkschnittstelle angehängt.
Kontrollgruppen (cgroups)
Cgroups sind grundlegende Blöcke zum Erstellen eines Containers. Eine Kontrollgruppe weist Ressourcen wie CPU, Arbeitsspeicher und Netzwerk-I/O zu und begrenzt diese, die von Containern verwendet werden. Die Container-Engine erstellt automatisch ein cgroup-Dateisystem jedes Typs und legt Werte für jeden Container fest, wenn der Container ausgeführt wird.
SECCOMP
Seccomp steht im Grunde für Secure Computing . Es handelt sich um eine Linux-Funktion, mit der die Anzahl der Systemaufrufe eingeschränkt wird, die eine Anwendung ausführen darf. Das standardmäßige seccomp-Profil für Docker deaktiviert beispielsweise etwa 44 Systemaufrufe (über 300 sind verfügbar).
Die Idee dabei ist, Containern nur Zugriff auf die Ressourcen zu gewähren, die der Container möglicherweise benötigt. Wenn Sie den Container beispielsweise nicht benötigen, um die Uhrzeit auf Ihrem Hostcomputer zu ändern, haben Sie wahrscheinlich keine Verwendung für clock_adjtime und clock_settime Systemaufrufe, und es ist sinnvoll, sie zu blockieren. Ebenso möchten Sie nicht, dass die Container die Kernel-Module ändern, also müssen sie create_module, delete_module nicht erstellen Systemaufrufe.
SELinux
SELinux steht für security-enhanced Linux . Wenn Sie eine Red Hat-Distribution auf Ihren Hosts ausführen, ist SELinux standardmäßig aktiviert. Mit SELinux können Sie eine Anwendung so beschränken, dass sie nur auf ihre eigenen Dateien zugreifen kann, und verhindern, dass andere Prozesse darauf zugreifen. Wenn also eine Anwendung kompromittiert wird, würde dies die Anzahl der Dateien einschränken, die sie beeinflussen oder kontrollieren kann. Dazu werden Kontexte für Dateien und Prozesse eingerichtet und Richtlinien definiert, die erzwingen, was ein Prozess sehen und ändern kann.
SELinux-Richtlinien für Container werden durch container-selinux
definiert Paket. Standardmäßig werden Container mit dem container_t ausgeführt Label und dürfen unter /usr lesen (r) und ausführen (x). Verzeichnis und lesen Sie die meisten Inhalte aus /etc Verzeichnis. Das Label container_var_lib_t ist üblich für Dateien, die sich auf Container beziehen.
Abschluss
Container sind ein kritischer Bestandteil der heutigen IT-Infrastruktur und auch eine ziemlich interessante Technologie. Auch wenn Ihre Rolle nicht direkt mit der Containerisierung zu tun hat, können Sie durch das Verständnis einiger grundlegender Containerkonzepte und -ansätze erkennen, wie sie Ihrer Organisation helfen können. Die Tatsache, dass Container auf Open-Source-Linux-Technologien basieren, macht sie noch besser!
Dieser Artikel basiert auf einem techbeatly-Artikel und wurde mit Genehmigung angepasst.