Comme nous le savons, par défaut, le conteneur Docker s'exécute sans systemd
signifie que l'utilisateur ne peut pas utiliser systemctl
commande. C'est parce que le conteneur que nous créons sur Docker n'a pas été démarré avec init. Ici, nous apprenons à exécuter Systemd dans les conteneurs Docker Alamlinux/Rocky Linux/CentOS 8.
Eh bien, la question est pourquoi obtenons-nous une erreur chaque fois que nous exécutons systemctl
commande dans n'importe quel conteneur Docker ? Quelle est la raison derrière cela ?
En fait, selon les développeurs Docker, qu'ils recommandent également, il convient d'utiliser un seul service dans un conteneur. Cela signifie que si vous envisagez d'installer WordPress à l'aide d'un conteneur, il devrait y avoir un seul conteneur par application. Par exemple Apache + PHP sur un conteneur tandis que MySQL sur un autre. Par conséquent, Docker a été développé sur ce modèle, ce qui signifie qu'il n'y a pas besoin de Systemd que l'on trouve dans n'importe quel système Linux standard pour gérer et exécuter plusieurs services en parallèle. Par conséquent, comme Docker suggère d'exécuter plusieurs conteneurs pour différentes applications, les développeurs ont donc désactivé ce gestionnaire de processus système pour améliorer l'isolation et la sécurité du conteneur, c'est la raison pour laquelle nous obtenons une erreur chaque fois que nous voulons utiliser le systemctl
commande.
Astuce :Qu'est-ce que Systemd ?
Systemd est un gestionnaire de système et de session (init system ) qui est responsable de la gestion de tous les services exécutés sur le système pendant toute la durée de fonctionnement de l'ordinateur, du processus de démarrage à l'arrêt. Les processus sont toujours démarrés en parallèle (dans la mesure du possible) pour que le processus de démarrage soit le plus court possible.
De plus, le systemd
est le premier processus à se déclencher dans un système Linux, c'est la raison pour laquelle nous exécutons ps -aux
commande sur n'importe quel terminal Linux, nous voyons que le premier processus (PID 1) est alloué au systemd
.
ps-aux
D'autre part, lorsque vous exécutez la même commande à l'intérieur d'un conteneur, vous verrez le PID (1) signifie que le premier processus du système a été alloué à bash .
Par conséquent, c'est la raison pour laquelle vous obtiendrez l'erreur chaque fois que vous essayez de démarrer un service à l'intérieur du conteneur Docker en utilisant le systemctl commande.
Installer ou activer systemd dans les conteneurs Almalinux ou Rocky Linux 8 Docker
Créer un fichier Docker
Certaines commandes doivent être exécutées avant de créer un conteneur à l'aide d'Almalinux ou de Rocky. Par conséquent, au lieu de les exécuter en une seule commande, ajoutons-les dans un fichier docker pour créer une image Docker activée avec systemd
.
Créer un répertoire, disons 'sysmd
‘ :
mkdir sysmd
passez-y :
cd sysmd
Créer un fichier Docker :
nano Dockerfile
Commandes à exécuter dans le fichier Docker pour obtenir Systemd
Maintenant, copiez-collez les commandes données dans le fichier Docker :
Remarque :Changer le almalinux
à rockylinux
, si vous souhaitez créer une image Docker pour exécuter Rocky Linux.
Les commandes données dans le fichier extrairont l'image Docker (Almalinux ou Rocky), puis exécuteront la commande suivante, y compris le montage du volume et la commande requise pour activer Systemd. De plus, nous supprimerons certains fichiers associés à systemd pour activer d'autres services dont nous n'avons pas besoin sur notre conteneur Docker en ligne de commande.
DEPUIS almalinux Conteneur ENV dockerRUN (cd /lib/systemd/system/sysinit.target.wants/; for i in; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done);RUN rm -rf /lib/systemd/system/multi-user.target.wants/ \&&rm -rf /etc/systemd/system/.wants/ \&&rm -rf /lib/systemd/system/local-fs.target. veut/ \&&rm -f /lib/systemd/system/sockets.target.wants/udev \&&rm -f /lib/systemd/system/sockets.target.wants/initctl \&&rm -rf /lib/systemd/ system/basic.target.wants/ \&&rm -f /lib/systemd/system/anaconda.target.wants/*VOLUME [ "/sys/fs/cgroup" ]CMD ["/usr/sbin/init"]
Enregistrez le fichier en appuyant sur Ctrl+O, appuyez sur Entrée touche , puis appuyez sur Ctrl+X pour quitter le fichier.
Créer un fichier conteneur Docker avec systemd
Maintenant, nous récupérons et construisons une image de conteneur tout en passant les commandes données dans le fichier Docker. Pour cela, il existe une commande appelée-
docker build
et nous utilisons le même.docker build -t almalinux-md .Remarque :Vous pouvez changer almalinux-md avec le nom que vous voulez donner à votre Image. Et n'oubliez pas non plus d'ajouter un point (. ) comme indiqué dans la commande ci-dessus, il guide la
build
commande pour rechercher le fichier Docker dans le répertoire.Vous pouvez voir que toutes les commandes données dans le fichier ont été exécutées par le
docker build
pour créer une nouvelle image avec le nom que vous lui avez donné.
Sortie :
Envoi du contexte de construction au démon Docker 2.56kB Étape 1/6 :FROM almalinux ---> 4ca63ce1d8a9 Étape 2/6 :docker conteneur ENV ---> Exécution dans 57d447426e1a Suppression du conteneur intermédiaire 57d447426e1a ---> fa30ff65bd36 Étape 3/ 6 :RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done); ---> Exécution dans bc3b161040e6 Suppression du conteneur intermédiaire bc3b161040e6 ---> 6f51cf56580e Étape 4/6 :RUN rm -rf /lib/systemd/system/multi-user.target.wants/ &&rm -rf /etc/systemd/system /.wants/ &&rm -rf /lib/systemd/system/local-fs.target.wants/ &&rm -f /lib/systemd/system/sockets.target.wants/udev &&rm -f /lib/systemd/ system/sockets.target.wants/initctl &&rm -rf /lib/systemd/system/basic.target.wants/ &&rm -f /lib/systemd/system/anaconda.target.wants/* ---> En cours d'exécution 082cfe33fc89 Retrait du conteneur intermédiaire 082cfe33fc89 ---> 9f8224491315 Étape 5/6 :VOLUME [ “/sys/fs/cgroup” ] ---> Running in fe0177b04643 Retrait du conteneur intermédiaire fe0177b04643 ---> 212b1b01046b Étape 6/6 :CMD [" /usr/sbin/init"] ---> Exécution dans bff7b36d4964 Suppression du conteneur intermédiaire bff7b36d4964 ---> 9b8dfd7c1d81 Construit avec succès 9b8dfd7c1d81 Balisé avec succès almalinux-md:latest
Vérifier la création d'une image Almalinux ou Rocky Linux
Maintenant, vérifions si l'image que nous avons créée ici pour démarrer les conteneurs ou non :
images fixes
Créer ou démarrer un conteneur Docker avec systemd
Nous avons l'image que nous venons de construire, utilisons-la pour créer un conteneur.
docker run -itd --privileged--name h2smedia almalinux-md
h2smedia
est le joli nom que l'on veut donner à notre conteneur alors quealmalinux-md
est le nom de l'image que nous avons créée, remplacez-la par la vôtre.Avertissement :Ici, nous exécutons le conteneur avec un privilégié flag, cela donnera plus de puissance aux conteneurs, en termes simples - le conteneur aura des droits ou des privilèges root sur la machine hôte. De tels conteneurs, nous les utilisons généralement lorsque nous voulons donner un accès matériel direct (de l'hôte) ou que nous voulons exécuter un conteneur à l'intérieur d'un conteneur. Il est donc recommandé de ne pas utiliser ces conteneurs à des fins commerciales ou d'entreprise lorsque des utilisateurs extérieurs accèdent à certains services. Faites-le uniquement à des fins de développement ou à des fins locales. C'est la raison pour laquelle nous avons exécuté la commande ci-dessus avec cet indicateur afin que nous puissions avoir la fonction Systemd ou init dans notre conteneur.
Basculer vers Container Bash
Maintenant, accédons à la ligne de commande du conteneur pour vérifier si nous pouvons exécuter
systemctl
commande ou non.
Maintenant, vous avez l'image Docker avec Systemd et cela vous permettra de créer autant de conteneurs que vous le souhaitez pour développer ou tester des applications locales.
Autres tutoriels :
• Comment installer et configurer Docker Container sur AlmaLinux 8
• Comment créer un fichier d'unité de service Systemd sous Linux
• Analyser le temps de démarrage du système Linux avec Systemd