systemd und systemctl in Ubuntu Docker-Images [geschlossen]

75

Problem

Es scheint systemdnicht aktiv oder in Ubuntu Docker-Images verfügbar zu sein.

Installieren

Ich führe Docker-Container aus den ubuntu:16.04und ubuntu:16.10Bildern aus.

Tests

Wenn ich ausführe:

systemctl status sshim 16,04Behälter

Das Ergebnis ist der Fehler Failed to connect to bus: No such file or directory

Im 16.10Container lautet der Fehler : bash: systemctl: command not found.

Wenn ich das which systemctltue, befindet sich systemctl im 16.04Container, aber nicht im 16.10Container.

Ich habe entdeckt, dass es /lib/systemdexistiert.

Ich habe versucht, systemd zu installieren mit:

apt-get install systemd libpam-systemd systemd-ui

Dann which systemctlfindet systemctl in16.10

systemctl status sshgibt aber trotzdem den fehlerFailed to connect to bus: No such file or directory

Fragen

Wie können systemd und systemctl für die Verwendung in Ubuntu Docker-Images aktiviert werden?

Warum ist systemd in Ubuntu Docker-Containern nicht aktiv? Wird systemd nicht zum Instanziieren des Containers verwendet?

Ich habe keine Dokumentation zu diesem Thema für Ubuntu / Ubuntu Docker-Images gefunden, nur Informationen zum Ubuntu-Übergang von Upstartzu systemd. Gibt es eine Dokumentation mit einer vollständigen Erklärung?

Duncan Gravill
quelle
Wenn Sie ein voll funktionsfähiges Init-System wünschen, verwenden Sie eine virtuelle Maschine.
user2105103
Es gibt mehrere Vorschläge zur Nachahmung eines Init-Systems bei PID-1 in einem Container. Grundsätzlich sollte es auf das SIGTERM reagieren, das von "Docker Stop" gesendet wird und es an andere Prozesse im Container verteilt. Und es sollte in der Lage sein, Zombies aus getöteten Hintergrundprozessen zu ernten. => Jetzt bleibt nur noch eine der Implementierungen auszuwählen, die es gibt. Einige portieren nur ein echtes "Init" in C / C ++, andere schreiben Skripte um Signal (3) und Waitpid (3) in einer Hochsprache - Pythons "Signal" -Standardbibliothek funktioniert auch dafür. (wie in meinem Docker-Systemctl-Ersatz-Skript gezeigt)
Guido U. Draheim
2
Docker-Image mit ausführen docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>und systemctlfunktioniert einwandfrei
Bucky

Antworten:

76

Dies ist beabsichtigt. Docker sollte einen Prozess im Vordergrund Ihres Containers ausführen und dieser wird als PID 1 im PID-Namespace des Containers erzeugt. Docker wurde für die Prozessisolierung entwickelt, nicht für die Betriebssystemvirtualisierung. Daher werden im Container keine anderen Betriebssystemprozesse und Dämonen ausgeführt (wie systemd, cron, syslog usw.), sondern nur Ihr Einstiegspunkt oder Befehl, den Sie ausführen.

Wenn sie systemd-Befehle enthalten, funktionieren viele Dinge nicht, da Ihr Einstiegspunkt init ersetzt. Systemd verwendet auch cgroups, die vom Docker innerhalb von Containern eingeschränkt werden, da durch die Möglichkeit, cgroups zu ändern, ein Prozess der Isolation des Containers entgehen kann. Ohne systemd, das als init in Ihrem Container ausgeführt wird, gibt es keinen Daemon, der Ihre Start- und Stoppbefehle verarbeitet.

BMitch
quelle
5
Es gibt keine Diskussion über einen Ihrer Punkte in dem Tutorial, auf das Sie verlinkt haben. Ich verstehe also nicht, wie Sie sagen können, dass es "so ziemlich die erste Notiz im Tutorial" ist und es wirklich nicht hilfreich ist, nur darauf zu verlinken die Titelseite der Dokumentation. Ich habe aus den Self-Paced Docker Training-Videos gelernt, dass der Entrypoint eines Containers PID 1 hat, so implizit verstanden, dass der Entrypoint systemd ersetzt. Nachdem ich jedoch zahlreiche Abschnitte der Docker-Dokumente gelesen habe, muss ich noch eine vollständige und klare Erklärung lesen.
Duncan Gravill
4
Um etwas Nützliches zu tun, enthält ein Basis-Image fast immer eine Betriebsumgebung. Mein Verständnis war, dass der einzige Unterschied zwischen diesem und einem vollständigen Betriebssystem darin besteht, dass es keinen Kernel hat und stattdessen den Kernel des Host-Betriebssystems verwendet. Möglicherweise wird eine Kenntnis der Betriebssysteme vorausgesetzt. Ich bin neu in Linux. Ich benötige eine detaillierte Erläuterung der Unterschiede zwischen einer regulären Ubuntu / Linux Distro-Betriebsumgebung und einer Dockerized Ubuntu / Linux Distro-Betriebsumgebung.
Duncan Gravill
1
Ein weiterer Punkt ist, dass das erste Schulungsvideo im eigenen Tempo impliziert, dass mehrere Prozesse in einem Container ausgeführt werden können. Daher bin ich der Meinung, dass Ihre Aussage zu "keine anderen Prozesse", die in einem Container ausgeführt werden, zumindest teilweise ungenau ist. Trotzdem danke für deine Antwort.
Duncan Gravill
1
Die am häufigsten gestellte Frage dazu lautet: Wie unterscheidet sich Docker von einer normalen virtuellen Maschine? was Sie vielleicht hilfreich finden.
BMitch
4
Übrigens ... da ich einige Skripte hatte, die auch "systemctl start" und "systemctl stop" ausgegeben haben, habe ich einfach ein Ersatzskript erstellt, das die notwendigen Schritte ausführen kann ... es interpretiert nur das /etc/systemd/system/*.service Dateien dafür. Dafür ist kein SystemD-Daemon erforderlich. Es kann sogar das ausführen, was Sie von einem PID-1-Prozess in einem Docker-Container erwarten würden. Fühlen Sie sich frei, einen Blick auf die github.com/gdraheim/docker-systemctl-replacement
Guido U. Draheim