Exécution de systemd dans un conteneur docker (arch linux)

12

J'essaie de voir si je peux exécuter systemd dans un conteneur docker (qui exécute arch linux dans le conteneur).

Je démarre Docker avec toutes les capacités et lie le montage dans les groupes de contrôle:

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

cependant, si j'essaye d'exécuter le binaire systemd:

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

Essayer de savoir comment lancer correctement les choses sur systemd démarre.

Michael Neale
la source
La systemdpage de manuel serait un bon point de départ. Google fournit également plusieurs articles sur l'exécution de systemd sous docker.
larsks
Pourriez-vous expliquer pourquoi vous avez besoin de systemd?
030

Réponses:

4

Pour exécuter systemd dans un conteneur Docker, le système hôte doit également exécuter systemd. Cela signifie que vous ne pouvez pas utiliser Ubuntu comme hôte. À l'heure actuelle, les seules distributions d'hôte que je connaisse de ce travail sont Fedora (qui, contrairement à Ubuntu, a la dernière version de Docker) ou RHEL 7.

Michael Hampton
la source
4
Arch Linux utilise également systemd.
Jason Antman
8
ubuntu à partir du 16.04 utilise systemd par défaut
Scott Stensland
4

Voici ma pièce maîtresse: D exécutant systemd à l'intérieur d'un conteneur docker avec ubuntu: D J'ai Got Ubuntu travaillant avec systemd à l'intérieur de docker

GitHub Repo pour mon conteneur docker-systemd

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

Production:

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
la source
6
Techniquement, cela fonctionne, mais vous avez dû briser la sécurité du conteneur pour le faire. Ce n'est pas approprié pour un déploiement en production.
Michael Hampton
Aujourd'hui, cela est possible plus facilement avec moins de drapeaux de sécurité
google-frank-dspeed
2

Actuellement, systemd ne fonctionne pas correctement dans un conteneur docker, pour toute une série de raisons, à savoir le manque de privilèges corrects. Vous pouvez le lire dans une variété de problèmes Github sur le projet Docker, comme l' exécution de systemd dans les blocages ou les erreurs de segmentation de Docker Arch et les problèmes connexes concernant la surveillance d'initialisation / de processus. (Je voudrais lier plus de problèmes ici, mais je ne peux pas car je n'ai apparemment pas assez de réputation).

Comme vous pouvez le voir, c'est un sujet sur lequel nous travaillons actuellement et quelques correctifs ont déjà été fusionnés pour améliorer le comportement, de sorte que nous pouvons nous attendre à ce que cela fonctionne très bientôt.

Apparemment, certains développeurs ont déjà réussi à le faire fonctionner sur les systèmes Fedora, comme ils l'ont documenté dans leur blog .

Alexander Jung-Loddenkemper
la source
2

Vous pouvez exécuter systemd dans un conteneur Docker. Le système d'exploitation hôte n'a pas d'importance, bien que vous deviez monter le volume / sys / fs / cgroup de l'hôte. Je l'ai fait fonctionner en suivant ce guide: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Tony H
la source
4
Bienvenue sur ServerFault. Au lieu de créer un lien vers une solution, veuillez en inclure les points essentiels ici dans votre réponse. De cette façon, votre réponse sera toujours utile si la cible du lien disparaît.
Andrew Schulman
L'article auquel vous créez un lien contient des informations très utiles. Pour que votre réponse soit complète, veuillez résumer ses principaux conseils exploitables (outre le montage de l'hôte /sys/fs/cgroup, que vous avez mentionné).
Amir
Et voici un article de suivi avec d'autres informations utiles: developers.redhat.com/blog/2016/09/13/…
Amir
1

J'ai pu travailler à l'envers à partir de ceci: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 facilite cela car les groupes (ro) sont déjà fournis dans des conteneurs - j'ai toujours besoin d'un accès privé pour pouvoir créer des montages PrivateTmp, mais sinon, tant que vous spécifiez la cmd à exécuter en tant que binaire systemd - cela fonctionne bien.

Michael Neale
la source
1

J'ai trouvé cette question en essayant de le faire dans le conteneur officiel debian: 8. Pour toute autre personne essayant de le faire sur le conteneur officiel debian: 8 (debian: jessie), la réponse de @ Frank-from-DSPEED fonctionne avec une légère modification, comme décrit dans un ancien post du hub git :

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

Puis dans le conteneur:

systemctl show-environment

Cela fonctionne parfaitement pour moi et comme il ne s'agit que d'un environnement de développement, le problème de sécurité n'a pas d'importance pour moi.

Remarque: La commande / sbin / init obtient / sbin / init pour être le processus 1, qui est un élément clé pour que cela fonctionne.

twildfarmer
la source
1
systemctl show-environmentreutrns pour moi Failed to get D-Bus connection: Unknown error -1. Lorsque je démarre le conteneur avec un --privilegedindicateur au lieu de --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 répond comme d'habitude
czerasz
@twildfarmer merci. Aussi pour tous ceux qui essaient cela. Un autre Dockerfile dans lequel cela a été implémenté est: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira
0

À partir de 2018, cela fonctionne maintenant pour moi: docker run -it -e container=docker votre-nom-d'image /sbin/init

Cela ne vous donnera pas de shell, cependant, vous devrez d'abord activer un service systemd (par exemple sshd) à l'intérieur de l'image si cela n'a pas déjà été fait, pour faire quelque chose d'utile.

Robin Green
la source
Pouvez-vous donner des détails sur l'image que vous utilisez pour cela? J'ai essayé Ubuntu, Debian, Arch, Alpine et OpenSUSE et aucun d'entre eux ne fonctionne. Soit le binaire n'existe pas, soit init ne parvient pas à ouvrir les ressources.
Codebling