Comme nous le savons par défaut, le conteneur Docker s’exécute sans systemd
signifie que l’utilisateur ne peut pas utiliser systemctl
commander. 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 courons systemctl
commande à l’intérieur d’un conteneur Docker ? Quelle en est la raison?
En fait, selon les développeurs Docker, qu’ils recommandent également, il faut utiliser un seul service à l’intérieur d’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 nous trouvons 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’isolement et la sécurité du conteneur, c’est la raison pour laquelle nous obtenons une erreur chaque fois que nous voulons utiliser le systemctl
commander.
Astuce – Qu’est-ce que Systemd?
Systemd est un gestionnaire de système et de session (système d’initialisation) 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) afin de maintenir le processus de démarrage aussi court que possible.
Également systemd
est le premier processus à se déclencher dans un système Linux, c’est la raison pour laquelle nous exécutons ps -aux
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é affecté à frapper.
Par conséquent, c’est la raison pour laquelle vous obtiendrez l’erreur chaque fois que vous essayez de démarrer un service dans le conteneur Docker en utilisant le systemctl commander.
Installer ou activer systemd dans les conteneurs Docker Almalinux ou Rocky Linux 8
Créer un fichier Docker
Il y a certaines commandes que nous devons exécuter avant de créer un conteneur à l’aide d’Almalinux ou de Rocky. Par conséquent, au lieu de les exécuter dans 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
basculer dessus :
cd sysmd
Créez 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 :
Noter: Changer la 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.
FROM almalinux ENV container docker RUN (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.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/* VOLUME [ “/sys/fs/cgroup” ] CMD ["/usr/sbin/init"]
Enregistrez le fichier en appuyant sur Ctrl+O, frapper le Entrer touche, puis appuyez sur Ctrl+X pour quitter le fichier.
Construire un fichier conteneur Docker avec systemd
Maintenant, nous récupérons et construisons une image de conteneur 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 .
Noter: 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 le build
commande pour rechercher le fichier Docker dans le répertoire.
Vous pouvez voir que toute la commande donnée dans le fichier a été exécutée par le docker build
pour créer une nouvelle image avec le nom que vous lui avez donné.
Sortir:
Sending build context to Docker daemon 2.56kB Step 1/6 : FROM almalinux ---> 4ca63ce1d8a9 Step 2/6 : ENV container docker ---> Running in 57d447426e1a Removing intermediate container 57d447426e1a ---> fa30ff65bd36 Step 3/6 : RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); ---> Running in bc3b161040e6 Removing intermediate container bc3b161040e6 ---> 6f51cf56580e Step 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/* ---> Running in 082cfe33fc89 Removing intermediate container 082cfe33fc89 ---> 9f8224491315 Step 5/6 : VOLUME [ “/sys/fs/cgroup” ] ---> Running in fe0177b04643 Removing intermediate container fe0177b04643 ---> 212b1b01046b Step 6/6 : CMD ["/usr/sbin/init"] ---> Running in bff7b36d4964 Removing intermediate container bff7b36d4964 ---> 9b8dfd7c1d81 Successfully built 9b8dfd7c1d81 Successfully tagged almalinux-md:latest
Rechercher une image Almalinux ou Rocky Linux créée
Maintenant, vérifions si l’image que nous avons créée ici pour démarrer les conteneurs ou non :
docker images
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 que almalinux-md
est le nom de l’image que nous avons créée, remplacez-le par le vôtre.
Avertissement: Ici, nous exécutons le conteneur avec un privilégié flag, cela donnera un pouvoir supplémentaire 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 direct au matériel (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 de tels conteneurs à des fins commerciales ou d’entreprise où 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.
Passer à 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 tutos :
• 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
— to www.how2shout.com