Ausführen von systemd in einem Docker-Container (Arch Linux)

12

Ich versuche herauszufinden, ob ich systemd in einem Docker-Container ausführen kann (in dem Arch Linux ausgeführt wird).

Ich starte docker mit allen Funktionen und binde mount in cgroups:

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..

Wenn ich jedoch versuche, die systemd-Binärdatei auszuführen:

Trying to run as user instance, but the system has not been booted with systemd.

Der Versuch, herauszufinden, wie man Dinge korrekt in systemd einleitet, beginnt.

Michael Neale
quelle
Die systemdManpage wäre ein guter Anfang. Google liefert auch mehrere Artikel über das Ausführen von systemd unter docker.
Larsks
Können Sie erklären, warum Sie systemd benötigen?
030

Antworten:

4

Um systemd in einem Docker-Container auszuführen, muss auf dem Host- System auch systemd ausgeführt werden. Dies bedeutet, dass Sie Ubuntu nicht als Host verwenden können. Derzeit sind die einzigen mir bekannten Host-Distributionen Fedora (das im Gegensatz zu Ubuntu die neueste Version von Docker hat) oder RHEL 7.

Michael Hampton
quelle
4
Arch Linux verwendet auch systemd.
Jason Antman
8
Ubuntu ab 16.04 verwendet standardmäßig systemd
Scott Stensland
4

Hier ist mein Master-Teil: D Ausführen von systemd in einem Docker-Container mit Ubuntu: D Ich habe Ubuntu dazu gebracht, mit systemd in Docker zu arbeiten

GitHub Repo für meinen Docker-System-Container

$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd

Ausgabe:

systemd 218 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)
Detected virtualization 'docker'.
Detected architecture 'x86-64'.

Welcome to Ubuntu Vivid Vervet (development branch)!

Set hostname to <502ec40509a5>.
[  OK  ] Created slice Root Slice.
[  OK  ] Created slice System Slice.
         Starting Emergency Shell...
[  OK  ] Started Emergency Shell.
Startup finished in 5ms.
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
try again to boot into default mode.
root@502ec40509a5:~# exit
google-frank-dspeed
quelle
6
Technisch funktioniert das, aber Sie mussten die Sicherheit des Containers brechen, um es zu tun. Dies ist für eine Produktionsbereitstellung nicht geeignet.
Michael Hampton
Heute ist dies mit weniger Sicherheitsflaggen einfacher möglich
google-frank-dspeed
2

Derzeit wird systemd in einem Docker-Container aus einer ganzen Reihe von Gründen, z. B. dem Fehlen der richtigen Berechtigungen, nicht ordnungsgemäß ausgeführt. Sie können dies in einer Vielzahl von Github-Problemen im Docker-Projekt nachlesen, wie z. B. das Ausführen von systemd in Docker Arch-Containern, Hänge oder Fehler in Bezug auf die Init / Prozess-Überwachung. (Ich würde gerne mehr Themen hier verlinken, aber ich kann nicht, da ich anscheinend nicht genug Ansehen habe).

Wie Sie sehen, wird an diesem Thema gerade gearbeitet, und einige Patches wurden bereits zusammengeführt, um das Verhalten zu verbessern, sodass wir davon ausgehen können, dass dies bald funktioniert.

Anscheinend ist es einigen Entwicklern bereits gelungen, es auf Fedora-Systemen zum Laufen zu bringen, wie sie in ihrem Blog dokumentiert haben .

Alexander Jung-Loddenkemper
quelle
2

Sie können systemd in einem Docker-Container ausführen. Das Host-Betriebssystem spielt keine Rolle, obwohl Sie das Volume / sys / fs / cgroup des Hosts mounten müssen. Ich habe es nach diesem Leitfaden zum Laufen gebracht : http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Tony H
quelle
4
Willkommen bei ServerFault. Anstatt auf eine Lösung zu verweisen, geben Sie in Ihrer Antwort hier die wichtigsten Punkte an. Auf diese Weise ist Ihre Antwort weiterhin nützlich, wenn das Linkziel nicht mehr angezeigt wird.
Andrew Schulman
Der Artikel, auf den Sie verlinken, enthält sehr nützliche Informationen. Damit Ihre Antwort vollständig ist, fassen Sie bitte die wichtigsten umsetzbaren Ratschläge zusammen (außer /sys/fs/cgroupdem von Ihnen erwähnten Anhängen der Hosts ).
Amir
Und hier ist ein Folgeartikel mit weiteren nützlichen Informationen: developers.redhat.com/blog/2016/09/13/…
Amir
1

Ich konnte von hier aus rückwärts arbeiten: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 macht dies einfacher, da Groups (ro) bereits in Containern bereitgestellt wird. Ich benötige derzeit noch Privatzugriff, damit PrivateTmp-Bereitstellungen erstellt werden können. Ansonsten funktioniert es einwandfrei, solange Sie das Cmd angeben, das als Systemd-Binärdatei ausgeführt werden soll.

Michael Neale
quelle
1

Ich habe diese Frage gefunden, als ich versucht habe, dies im offiziellen debian: 8-Container zu tun. Für alle anderen, die dies auf dem offiziellen debian: 8 (debian: jessie) -Container versuchen, funktioniert die Antwort von @ Frank-from-DSPEED mit einer leichten Modifikation, wie in einem älteren Git-Hub-Beitrag beschrieben :

docker run -d \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    --cap-add SYS_ADMIN \
    debian:jessie  /sbin/init
docker exec -it <your-new-container-name-or-ID> bash

Dann aus dem Container:

systemctl show-environment

Das funktioniert bei mir perfekt und da es sich nur um eine Entwicklungsumgebung handelt, ist mir das Sicherheitsproblem egal.

Hinweis: Mit dem Befehl / sbin / init wird / sbin / init als Prozess 1 definiert. Dies ist ein wesentlicher Bestandteil dieser Funktion.

Zwillingsbäuerin
quelle
1
systemctl show-environmenternährt sich für mich Failed to get D-Bus connection: Unknown error -1. Wenn ich den Container mit einem --privilegedFlag anstelle von --cap-add SYS_ADMIN( docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init) starte, antwortet systemctl wie gewohnt
czerasz
@twildfarmer danke. Auch für alle anderen, die dies versuchen. Ein weiteres Dockerfile, in das dies implementiert wurde, ist: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira
0

Ab 2018 funktioniert das jetzt bei mir: docker run -it -e container=docker Dein-Bild-Name /sbin/init

Dies gibt Ihnen jedoch keine Shell, so dass Sie zuerst einen systemd-Dienst (z. B. sshd) im Image aktivieren müssen, wenn dies noch nicht geschehen ist, um etwas Nützliches zu tun.

Robin Green
quelle
Können Sie Einzelheiten dazu angeben, welches Bild Sie dafür verwenden? Ich habe Ubuntu, Debian, Arch, Alpine und OpenSUSE ausprobiert und keines davon funktioniert. Entweder existiert die Binärdatei nicht oder init kann keine Ressourcen öffnen.
Code Bling