Docker-Container haben einen eigenen Kernel oder nicht?

65

Ich sehe, dass viele Docker-Images im Docker-Repository mit einer Ubuntu-Basis erstellt wurden.

Was bedeutet das? Enthält jeder Container eine abgespeckte Version des Linux-Kernels?

Sitzen Container auf ihren eigenen Kerneln? Aber ich dachte, Container teilen sich den Kernel des Hosts (der in einigen Fällen boot2docker ist, ein angepasster Tiny Core Linux Build, und in anderen so etwas wie CoreOS).

EDIT: Die Frage ein bisschen klären. Ja, ich weiß, Docker ist ein Prozesscontainer, keine vollständige VM. Aber da es "Ubuntu" -Container in der offiziellen Docker-Hub-Registrierung und in anderen Betriebssystemen wie CentOS gibt, was bedeutet es, Ubuntu in einem Container auszuführen?

Antwort: Ahh, es ist mir gerade aufgegangen. Es sind die Ubuntu-Benutzer-Land-Prozesse, die apt-get und andere Konfigurationsprozesse für einen bestimmten Ubuntu-Build enthalten. Ähnliches gilt für CentOS. Docker ist kein einzelner Prozess, nur ein einzelner Eintrag. Für diese Distributionen ist der Einstiegspunkt also eine Art Init-Prozess, der andere Prozesse hervorbringt.

stewart99
quelle
2
"Es sind die Ubuntu-User-Land-Prozesse" - nicht nur Prozesse, sondern auch Bibliotheken.
osgx

Antworten:

37

Docker verwendet den Kernel des Host-Betriebssystems. Es gibt keinen benutzerdefinierten oder zusätzlichen Kernel im Container. Alle Container, die auf einer Maschine laufen, teilen sich diesen "Host" -Kernel.

Wikipedia sagt http://en.wikipedia.org/wiki/Docker_(software) das

Docker verwendet Ressourcenisolierungsfunktionen des Linux-Kernels wie cgroups und Kernel-Namespaces, um die Ausführung unabhängiger "Container" innerhalb einer einzelnen Linux-Instanz zu ermöglichen und den Overhead beim Starten virtueller Maschinen zu vermeiden.

cgroups, Namespaces und LXC sind Funktionen des Linux-Kernels zum Isolieren von Prozessgruppen. Es gibt immer noch einen einzelnen Kernel, einen einzelnen Scheduler und eine Instanz des Kernel-Speichermanagers.

Boot2docker und CoreOS sind einfache Linux-Distributionen mit einem Host-Kernel. Sie können zum Laden von Docker-Containern verwendet werden.

http://boot2docker.io/

boot2docker ist eine kompakte Linux-Distribution, die auf Tiny Core Linux basiert und speziell für die Ausführung von Docker-Containern entwickelt wurde. Es läuft komplett aus dem RAM, wiegt ~ 27MB und bootet in ~ 5s (YMMV).

http://en.wikipedia.org/wiki/CoreOS

Ein einzelner Steuerhost (CoreOS-Instanz) führt mehrere isolierte Linux-Systeme (Container) aus und verwendet Docker als zusätzliche Abstraktionsebene und Schnittstelle [14] zu den zugrunde liegenden Virtualisierungsfunktionen des Linux-Kernels auf Betriebssystemebene. ... Dieser Ansatz stützt sich auf die cgroups-Funktionalität des Linux-Kernels, die Namespace-Isolation bietet und die Möglichkeit bietet, die Ressourcennutzung (CPU, Speicher, Festplatten-E / A usw.) für die Auflistungen von Prozessen zu begrenzen, zu berücksichtigen und zu isolieren.

osgx
quelle
1
Dies beantwortet die Frage nicht.
EML
2
EML, welche Frage? Standardmäßig haben alle Docker-Container keinen eigenen Kernel. Es gibt nur einen Host-Kernel für alle Docker-Container.
osgx
Sicher, Ihre Antwort ist soweit in Ordnung, aber der OP wollte wissen, warum er FROMein Ubuntu-Basis-Image benötigt, wenn der Host bereits Ubuntu ausführt. Um die Frage zu beantworten, müssen Sie erklären, was ein Basisimage ist.
EML
2
EML, die Frage wurde mit "Klären" ( superuser.com/posts/889472/revisions ) bearbeitet, nachdem meine Antwort gepostet wurde, daher ist es eine Antwort auf die ursprüngliche Frage ohne Klärung. Wenn Sie Informationen zu Basis-Images und -Kernen im Docker haben, fügen Sie eine weitere Antwort hinzu.
Oslo
17

In fast allen Fällen wird der Kernel des Host-Betriebssystems gemeinsam genutzt. Um einen anderen Kernel auszuführen, müssen Sie Virtualisierung verwenden. Dies ist selten und wird nur bei Bedarf aufgrund von Leistungseinbußen verwendet.

"Der Docker Engine-Container besteht nur aus der Anwendung und ihren Abhängigkeiten. Er wird als isolierter Prozess im Benutzerbereich auf dem Host-Betriebssystem ausgeführt und teilt den Kernel mit anderen Containern. Auf diese Weise profitiert er von den Vorteilen der Ressourcenisolierung und -zuweisung von VMs, ist aber noch viel mehr portabel und effizient. "

Dies könnte helfen zu erklären, wie es funktioniert: Bildbeschreibung hier eingeben

Quelle: https://www.docker.com/whatisdocker/

JeremiahBarrar
quelle
4
Jede Quelle für "Pakete können unterschiedliche Kernel verwenden" ??? Docker selbst kann nicht mehrere Kernel verwenden, es gibt immer nur einen Host-Kernel. Nur in Kombination mit Hypervisor (Virtualisierung) können wir mehrere Hosts mit jeweils eigener Kernelversion starten und einen Docker pro virtuellem Host ausführen. aber für jeden host gibt es nur einen kernel für host und seine angedockten container)
osgx
2
Was ist paket Der Docker-Container enthält keinen Kernel. Es wurde gerade auf dem Kernel installiert und gestartet, der auf dem Host verwendet wird. Also: ein Docker = ein Server = ein Kernel, wie im Bild gezeigt. Es ist nicht möglich, zwei Kernel mit einer Docker-Engine zu verwenden. Alle Container in dieser Engine verwenden denselben Kernel. Ich denke, die richtige Antwort lautet "Nein, Docker-Container können innerhalb einer einzelnen Instanz von Docker Engine keine unterschiedlichen Kernel verwenden"
osgx
1
Jeder Docker-Container kann beliebigen Code ausführen, einschließlich Virtualisierungssoftware, mit der jeder Kernel geladen werden kann, den Ihre Software möglicherweise benötigt. Sie können Windows in einem Container ausführen, wenn Sie möchten.
JeremiahBarrar
1
JeremiahBarrar, Verstanden, danke für die Erklärung. Ist die Ausführung von Virtualisierungssoftware im Docker-Container dokumentiert und wird sie von Docker unterstützt? Welche Art von Virtualisierung wird von Docker aus funktionieren (Software qemu, qemu + kvm, xen, ...)?
osgx
2
Der erste Satz ist irreführend. Wenn Sie eine VM in einem Container verwenden, können Sie Docker nicht mehr verwenden.
user2707671