Ihnen fehlen grundlegende Docker-Konzepte. Es ist eine ganz andere Sache.
Das erste, was Sie wissen müssen, ist die Philosophie von Docker: Führen Sie einen Prozess isoliert in einem Container aus. Sie führen kein Betriebssystem in einem Docker-Container aus, sondern einen Prozess in einem Container mit einem Root-Dateisysteminhalt, der auf einer Linux-Distribution Ihrer Wahl basiert. Ubuntu ist unter anderem eine Wahl.
Nun sollten Sie sich fragen, wie es möglich ist, einen Prozess in einem Linux-Basisimage auszuführen, der sich von der Linux-Distribution unterscheidet, mit der Ihr Host ausgeführt wird. Damit ein Betriebssystem ausgeführt werden kann, benötigen Sie grundsätzlich:
- Ein Boot-Dateisystem: Enthält den Bootloader und den Kernel, die sich nach dem Laden im Speicher befinden. Bei Docker-Containern ist uns das egal, da der Kernel mit dem Host geteilt wird und der gemeinsame Teil aller Linux-Distributionen ist.
- Ein Root-Dateisystem: Enthält die Dateisystemstruktur. Es kann von einer Linux-Distribution zur anderen unterschiedlich sein. Es ist schreibgeschützt, bis die Startsequenz beendet ist.
Docker verwendet UnionFS, um Schichten von Plattenblöcken in einem Container zu verwalten, damit Sie sie stapeln können.
Hinter den Kulissen wird ein Union Mount verwendet, mit dem mehrere Dateisysteme gleichzeitig gemountet werden können und wie ein ganzes virtuelles erscheinen. Tatsächlich wird die Basis-Image-Ebene im schreibgeschützten Modus als Lese- / Schreibmodus über dem Basis-Root-Dateisystem abgelegt.
Hier haben Sie einen Stapel von Festplattenblöcken, die so geschichtet sind, dass die Linux-Distribution, von der das Basis-Image stammt, dasselbe Dateisystem enthält, sobald es auf einem echten Host installiert ist, diesmal jedoch in einem Container.
Das Letzte, was jetzt fehlt, ist: Wie lässt du dieses Ding isoliert laufen?
Die Antwort lautet: Namespaces. Ich werde hier nicht auf die Details eingehen, da dies etwas von der ursprünglichen Frage abweichen würde. Was Sie jedoch wissen müssen, ist, dass seit Kernel 2.4.19 im Laufe der Jahre Namespaces verschiedener Art aufgetaucht sind. Derzeit sind folgende Namespaces verfügbar:
- IPC: IPC-Namespace (Interprozesskommunikation)
- MNT: Mount-Namespace
- NET: Netzwerk-Namespace
- PID: PID-Namespace
- USER: Benutzernameraum (UID)
- UTS: UTS-Namespace (Hostnamen)
Namespaces sind isolierte Strukturen im Kernel, mit denen Prozesse in einer bestimmten Umgebung ausgeführt werden können. Zum Beispiel ist der MNT-Namespace das Hauptmerkmal, um einen Prozess in den Besonderheiten des Basis-Image-Stammdateisystems zum Laufen zu bringen. Der NET-Namespace ist eine weitere wichtige Funktion für einen Container, der über bestimmte Netzwerkschnittstellen verfügt, um mit der Docker-Brücke usw. zu kommunizieren.
Ja, der Hauptzweck all dessen ist es, eine Anwendung isoliert auszuführen und sie in einer Box namens Container problemlos aus Ihrer lokalen Umgebung an die Produktion zu senden.
Es wäre eine gute Idee, die Docker-Dokumentation zu lesen , bevor Sie sich weiter damit befassen .