92 votes

Impossible d'utiliser systemd sur un conteneur docker ubuntu

Problème

Il semble systemd n'est pas actif ou disponible dans les conteneurs Docker Ubuntu.

Configuration

J'exécute des conteneurs Docker à partir de la base de données ubuntu:16.04 y ubuntu:16.10 des images.

Tests

Si je m'exécute :

systemctl status ssh dans le 16,04 conteneur

le résultat est l'erreur Failed to connect to bus: No such file or directory

Dans le 16.10 conteneur l'erreur est : bash: systemctl: command not found .

Si je le fais which systemctl systemctl se trouve dans le répertoire 16.04 mais pas dans le conteneur 16.10 conteneur.

J'ai repéré que /lib/systemd existe.

J'ai essayé d'installer systemd avec :

apt-get install systemd libpam-systemd systemd-ui

Puis which systemctl trouve systemctl dans 16.10

mais systemctl status ssh donne toujours l'erreur Failed to connect to bus: No such file or directory

Questions

Comment activer systemd et systemctl pour les utiliser dans les images Docker d'Ubuntu ?

Pourquoi systemd n'est pas actif dans les conteneurs Docker d'Ubuntu ? Systemd n'est-il pas utilisé lors de l'instanciation du conteneur ?

Je n'ai pas réussi à trouver de documentation à ce sujet pour les images Ubuntu / Ubuntu Docker, seulement des informations sur la transition d'Ubuntu à partir de Upstart a systemd . Existe-t-il une documentation donnant une explication complète ?

0 votes

Si vous voulez un système init entièrement fonctionnel, utilisez une machine virtuelle.

0 votes

Il existe plusieurs propositions pour imiter un système init à PID-1 à l'intérieur d'un conteneur. En gros, il devrait réagir au SIGTERM envoyé par "docker stop" en le distribuant aux autres processus du conteneur. Et il devrait être capable de récolter les zombies des processus d'arrière-plan tués. => Il ne reste plus qu'à choisir une des implémentations qui existent. Certains ne font que porter un véritable "init" en C/C++, d'autres font du scripting autour de signal(3) et waitpid(3) dans un langage de haut niveau - la librairie standard "signal" de Python fonctionne aussi pour cela. (comme indiqué dans mon remplacement docker-systemctl script)

3 votes

Exécuter l'image docker avec docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image> y systemctl fonctionne bien

95voto

BMitch Points 3744

C'est un choix délibéré. Docker devrait exécuter un processus au premier plan dans votre conteneur et il sera créé en tant que PID 1 dans l'espace de noms pid du conteneur. Docker est conçu pour l'isolation des processus, et non pour la virtualisation du système d'exploitation. Il n'y a donc pas d'autres processus ou démons de système d'exploitation qui s'exécutent dans le conteneur (comme systemd, cron, syslog, etc.), seulement votre point d'entrée ou la commande que vous exécutez.

S'ils incluaient les commandes systemd, vous trouveriez beaucoup de choses qui ne fonctionnent pas puisque votre point d'entrée remplace init. Systemd utilise également les cgroups que docker restreint à l'intérieur des conteneurs, car la possibilité de changer de cgroups pourrait permettre à un processus d'échapper à l'isolation du conteneur. Sans systemd s'exécutant comme init à l'intérieur de votre conteneur, il n'y a pas de démon pour traiter vos commandes de démarrage et d'arrêt.

7 votes

Il n'y a aucune discussion sur aucun de vos points dans le tutoriel que vous avez mis en lien, donc je ne vois pas comment vous pouvez dire que c'est "à peu près la première note dans le tutoriel" et il n'est vraiment pas utile de simplement mettre un lien vers la première page de la documentation. J'ai appris dans les vidéos de formation Docker Self-Paced que le point d'entrée d'un conteneur a le PID 1, et j'ai donc implicitement compris que le point d'entrée remplace systemd. Cependant, après avoir lu de nombreuses sections de la documentation de Docker, j'ai l'impression que je n'ai pas encore lu une explication complète et claire.

4 votes

Pour faire quelque chose d'utile, une image de base contient presque toujours un environnement d'exploitation. Si j'ai bien compris, la seule différence avec un système d'exploitation complet est qu'il n'a pas de noyau et utilise celui du système d'exploitation hôte. Peut-être qu'une connaissance des systèmes d'exploitation est supposée. Je suis novice en matière de Linux. J'ai besoin d'une explication détaillée des différences entre un environnement d'exploitation Ubuntu/Linux ordinaire et un environnement d'exploitation Ubuntu/Linux Dockerisé.

1 votes

Par ailleurs, la première vidéo d'auto-formation implique que plusieurs processus peuvent être exécutés dans un conteneur. J'ai donc le sentiment que votre affirmation selon laquelle "aucun autre processus" ne peut être exécuté dans un conteneur est au moins partiellement inexacte. Merci quand même pour votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X