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.


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.


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

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 .


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/


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.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.