Uruchamianie systemd w kontenerze dokera (arch Linux)

12

Próbuję sprawdzić, czy mogę uruchomić systemd w kontenerze dokera (który uruchamia arch linux w kontenerze).

Zaczynam dokera ze wszystkimi możliwościami i wiążę mount w cgroups:

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

jeśli jednak spróbuję uruchomić systemdinary:

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

Rozpocznie się próba znalezienia sposobu prawidłowego inicjowania rzeczy w systemie.

Michael Neale
źródło
systemdStrona człowiek byłby dobrym miejscem, aby rozpocząć. Google publikuje także kilka artykułów na temat uruchamiania systemu pod dokerem.
larsks
Czy możesz wyjaśnić, dlaczego potrzebujesz systemd?
030

Odpowiedzi:

4

Aby uruchomić systemd w kontenerze Docker, system hosta musi również uruchomić systemd. Oznacza to, że nie możesz używać Ubuntu jako hosta. W tej chwili jedynymi znanymi mi dystrybucjami hosta są Fedora (która, w przeciwieństwie do Ubuntu, ma najnowszą wersję Dockera) lub RHEL 7.

Michael Hampton
źródło
4
Arch Linux używa także systemd.
Jason Antman
8
Ubuntu od 16.04 używa domyślnie systemd
Scott Stensland
4

Oto moja główna wycena: D uruchomiony systemd w kontenerze dokera z Ubuntu: D Mam Ubuntu pracujący z systemd wewnątrz dokera

GitHub Repo dla mojego kontenera systemowego dokera

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

Wynik:

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
źródło
6
Technicznie to działa, ale trzeba było złamać zabezpieczenia kontenera, aby to zrobić. Nie jest to odpowiednie dla wdrożenia produkcyjnego.
Michael Hampton
Dzisiaj jest to łatwiejsze przy mniejszej liczbie flag bezpieczeństwa
google-frank-dspeed
2

Obecnie systemd nie działa poprawnie w kontenerze dokera z powodu całego zestawu przyczyn, tj. Braku odpowiednich uprawnień. Możesz przeczytać o tym w różnych kwestiach związanych z github w projekcie dokera, takich jak uruchamianie systemd wewnątrz zawieszeń kontenera łuku dokującego lub segfault i powiązanych zagadnień dotyczących monitorowania init / procesu. (Chciałbym tutaj powiązać więcej problemów, ale nie mogę, ponieważ najwyraźniej nie mam wystarczającej reputacji).

Jak widać, jest to temat, nad którym obecnie pracujemy, a kilka łatek zostało już scalonych w celu poprawy zachowania, dzięki czemu możemy spodziewać się, że zadziała to wkrótce.

Najwyraźniej niektórym programistom udało się już uruchomić go na systemach fedora, jak udokumentowali na swoim blogu .

Alexander Jung-Loddenkemper
źródło
2

Możesz uruchomić systemd w kontenerze dokera. System operacyjny hosta nie ma znaczenia, chociaż będziesz musiał zamontować wolumin hosta / sys / fs / cgroup. Mam go do pracy zgodnie z tym przewodnikiem: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Tony H.
źródło
4
Witamy w ServerFault. Zamiast linkować do rozwiązania, w odpowiedzi należy podać jego zasadnicze punkty. W ten sposób Twoja odpowiedź będzie nadal przydatna, jeśli cel linku zniknie.
Andrew Schulman,
Artykuł, do którego prowadzi link, zawiera bardzo przydatne informacje. Aby odpowiedź była kompletna, proszę podsumować jej najważniejsze przydatne porady (oprócz montowania hosta /sys/fs/cgroup, o których wspomniałeś).
Amir
A oto artykuł uzupełniający z dalszymi przydatnymi informacjami: developers.redhat.com/blog/2016/09/13/…
Amir
1

Byłem w stanie pracować wstecz od tego: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 ułatwia to, ponieważ grupy (ro) są już dostępne w kontenerach - wciąż potrzebuję dostępu prywatnego, aby móc tworzyć wierzchowce PrivateTmp, ale inaczej, o ile podasz cmd do uruchomienia jako systemowy plik binarny - działa dobrze.

Michael Neale
źródło
1

Znalazłem to pytanie, próbując to zrobić w oficjalnym kontenerze debian: 8. Dla każdego, kto próbuje to zrobić na oficjalnym kontenerze debian: 8 (debian: jessie), odpowiedź @ Frank-from-DSPEED działa z niewielką modyfikacją, jak opisano w starszym poście git hub :

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

Następnie z pojemnika:

systemctl show-environment

Działa to dla mnie idealnie, a ponieważ jest to tylko środowisko programistyczne, kwestia bezpieczeństwa nie ma dla mnie znaczenia.

Uwaga: Komenda / sbin / init pobiera / sbin / init na Proces 1, który jest kluczowym elementem umożliwiającym to działanie.

twildfarmer
źródło
1
systemctl show-environmentodnawia dla mnie Failed to get D-Bus connection: Unknown error -1. Kiedy uruchamiam kontener z --privilegedflagą zamiast --cap-add SYS_ADMIN( docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init) systemctl odpowiada jak zwykle
czerasz
@twildfarmer dziękuję. Także dla każdego, kto spróbuje tego. Kolejnym plikiem Docker, w którym zostało to zaimplementowane, jest: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira
0

Począwszy od 2018 roku, to działa teraz dla mnie: docker run -it -e container=docker twoja-nazwa-obrazu /sbin/init

Nie da to jednak powłoki, więc aby zrobić coś pożytecznego, musisz najpierw włączyć usługę systemową (np. Sshd) w obrazie, jeśli nie zostało to jeszcze zrobione.

Robin Green
źródło
Czy możesz podać szczegóły, jakiego obrazu używasz do tego? Próbowałem Ubuntu, Debian, Arch, Alpine i OpenSUSE i żadne z nich nie działa. Albo plik binarny nie istnieje, albo init nie otwiera zasobów.
Codebling