GNU/Linux >> Tutoriels Linux >  >> Linux

Démystifier les espaces de noms et les conteneurs sous Linux

Les conteneurs ont pris d'assaut le monde. Que vous pensiez à Kubernetes, Docker, CoreOS, Silverblue ou Flatpak lorsque vous entendez le terme, il est clair que les applications modernes s'exécutent dans des conteneurs pour plus de commodité, de sécurité et d'évolutivité.

Cependant, les conteneurs peuvent être difficiles à comprendre. Qu'est-ce que cela signifie de courir dans un conteneur ? Comment les processus d'un conteneur peuvent-ils interagir avec le reste de l'ordinateur sur lequel ils s'exécutent ? L'open source n'aime pas le mystère, donc cet article explique le backend de la technologie des conteneurs, tout comme mon article sur Flatpak a expliqué un frontend commun.

Espaces de noms

Les espaces de noms sont courants dans le monde de la programmation. Si vous vivez dans les endroits hautement techniques du monde informatique, vous avez probablement déjà vu un code comme celui-ci :

using namespace std;

Ou vous avez peut-être vu ceci en XML :

<book xmlns="http://docbook.org/ns/docbook" xml:lang="en">

Ces types de phrases fournissent un contexte pour les commandes utilisées ultérieurement dans un fichier de code source. La seule raison pour laquelle C++ sait, par exemple, ce que veulent dire les programmeurs lorsqu'ils tapent cout est parce que C++ connaît le cout namespace est un mot significatif.

Conteneurs Linux

  • Que sont les conteneurs Linux ?
  • Une introduction à la terminologie des conteneurs
  • Télécharger :Introduction aux conteneurs
  • Opérateurs Kubernetes :automatisation de la plate-forme d'orchestration de conteneurs
  • eBook :Modèles Kubernetes pour la conception d'applications cloud natives
  • Qu'est-ce que Kubernetes ?

Si c'est trop technique pour que vous puissiez l'imaginer, vous serez peut-être surpris d'apprendre que nous utilisons également tous les jours des espaces de noms dans la vraie vie. Nous ne les appelons pas des espaces de noms, mais nous utilisons le concept tout le temps. Par exemple, l'expression "Je suis un fan de l'entreprise" a une signification dans une société informatique qui sert de grandes entreprises (communément appelées "entreprises"), mais elle peut avoir une signification différente lors d'une convention de science-fiction. La question "quel moteur tourne-t-il?" a une signification dans un garage et une signification différente dans le développement Web. Nous ne déclarons pas toujours un espace de noms dans une conversation informelle parce que nous sommes humains et que notre cerveau peut s'adapter rapidement pour déterminer le contexte, mais pour les ordinateurs, l'espace de noms doit être déclaré explicitement.

Pour les conteneurs, un espace de noms est ce qui définit les limites de la "conscience" d'un processus de ce qui se passe autour de lui.

lsns

Vous ne vous en rendez peut-être pas compte, mais votre machine Linux maintient discrètement différents espaces de noms spécifiques à des processus donnés. En utilisant une version récente de util-linux package, vous pouvez répertorier les espaces de noms existants sur votre machine :

$ lsns
        NS TYPE   NPROCS   PID USER    COMMAND
4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user
4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user
4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user
4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...]
4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...]
[...]

Si votre version de util-linux ne fournit pas le lsns commande, vous pouvez voir les entrées d'espace de noms dans /proc :

$ ls /proc/*/ns
1571
6266
7164
[...]
$ ls /proc/6266/ns
ipc net pid user uts [...]

Chaque processus en cours d'exécution sur votre machine Linux est énuméré avec un ID de processus (PID). Chaque PID se voit attribuer un espace de noms. Les PID dans le même espace de noms peuvent avoir accès les uns aux autres car ils sont programmés pour fonctionner dans un espace de noms donné. Les PID dans différents espaces de noms ne peuvent pas interagir les uns avec les autres par défaut car ils s'exécutent dans un contexte différent, ou espace de noms . C'est pourquoi un processus s'exécutant dans un "conteneur" sous un espace de noms ne peut pas accéder aux informations en dehors de son conteneur ou aux informations s'exécutant à l'intérieur d'un conteneur différent.

Création d'un nouvel espace de noms

Une fonctionnalité habituelle des logiciels traitant des conteneurs est la gestion automatique des espaces de noms. Un administrateur humain qui démarre une nouvelle application ou un nouvel environnement conteneurisé n'a pas besoin d'utiliser lsns pour vérifier quels espaces de noms existent, puis en créer un nouveau manuellement ; le logiciel utilisant les espaces de noms PID le fait automatiquement à l'aide du noyau Linux. Cependant, vous pouvez imiter le processus manuellement pour mieux comprendre ce qui se passe dans les coulisses.

Tout d'abord, vous devez identifier un processus qui n'est pas en cours d'exécution sur votre ordinateur. Pour cet exemple, j'utiliserai le shell Z (Zsh) car j'exécute le shell Bash sur ma machine. Si vous exécutez Zsh sur votre ordinateur, utilisez Bash ou tcsh ou un autre shell que vous n'utilisez pas actuellement. Le but est de trouver quelque chose dont vous pouvez prouver qu'il ne fonctionne pas. Vous pouvez prouver que quelque chose ne fonctionne pas avec le pidof commande, qui interroge votre système pour découvrir le PID de toute application que vous nommez :

$ pidof zsh
$ sudo pidof zsh

Tant qu'aucun PID n'est renvoyé, l'application que vous avez interrogée n'est pas en cours d'exécution.

Annuler le partage

L'option annuler le partage la commande exécute un programme dans un espace de noms non partagé de son processus parent. Il existe de nombreux types d'espaces de noms disponibles, alors lisez le unshare page de manuel pour toutes les options disponibles.

Pour créer un nouvel espace de noms pour votre commande de test :

$ sudo unshare --fork --pid --mount-proc zsh
%

Parce que Zsh est un shell interactif, il vous amène facilement dans son espace de noms lors du lancement. Tous les processus ne le font pas, car certains processus s'exécutent en arrière-plan, vous laissant à une invite dans son espace de noms natif. Tant que vous restez dans la session Zsh, vous pouvez voir que vous avez quitté l'espace de noms habituel en regardant le PID de votre nouveau processus fork :

% pidof zsh
pid 1

Si vous savez quelque chose sur les ID de processus Linux, alors vous savez que le PID 1 est toujours réservé, principalement par la nature du processus de démarrage, pour l'application d'initialisation (systemd sur la plupart des distributions en dehors de Slackware, Devuan et peut-être certaines installations personnalisées d'Arch) . Il est presque impossible pour Zsh, ou toute application qui n'est pas une application d'initialisation de démarrage, d'être PID 1 (car sans système init, un ordinateur ne saurait pas démarrer). Pourtant, pour autant que votre shell le sache dans cette démonstration, Zsh occupe l'emplacement PID 1.

Malgré ce que votre shell vous dit maintenant, le PID 1 sur votre système n'a pas été remplacé. Ouvrez un deuxième terminal ou onglet de terminal sur votre ordinateur et regardez le PID 1 :

$ ps 1
init

Et puis trouvez le PID de Zsh :

$ pidof zsh
7723

Comme vous pouvez le voir, votre système "hôte" voit la situation dans son ensemble et comprend que Zsh fonctionne en fait comme un PID à numéro élevé (ce ne sera probablement pas 7723 sur votre ordinateur, sauf par coïncidence). Zsh se considère comme PID 1 uniquement parce que sa portée est confinée à (ou contenue dans) son espace de noms. Une fois que vous avez forké un processus dans son propre espace de noms, ses processus enfants sont numérotés à partir de 1, mais uniquement dans cet espace de noms.

Espaces de noms, ainsi que d'autres technologies telles que cgroups et plus encore, forment la base de la conteneurisation. Comprendre que les espaces de noms existent dans le contexte de l'espace de noms plus large d'un environnement hôte (dans cette démonstration, il s'agit de votre ordinateur, mais dans le monde réel, l'hôte est généralement un serveur ou un cloud hybride) peut vous aider à comprendre comment et pourquoi les applications conteneurisées agissent comme ils le font. Par exemple, un conteneur exécutant un blog Wordpress ne "sait" pas qu'il ne s'exécute pas dans un conteneur ; il sait qu'il a accès à un noyau et à de la RAM et à tous les fichiers de configuration que vous lui avez fournis, mais il ne peut probablement pas accéder à votre répertoire personnel ou à tout répertoire auquel vous ne lui avez pas spécifiquement donné l'autorisation d'accéder. De plus, un processus incontrôlable au sein de ce logiciel de blog ne peut affecter aucun autre processus de votre système, car pour autant qu'il le sache, "l'arborescence" PID ne remonte qu'à 1, et 1 est le conteneur dans lequel il s'exécute.

Les conteneurs sont une fonctionnalité Linux puissante, et ils deviennent de plus en plus populaires chaque jour. Maintenant que vous comprenez leur fonctionnement, essayez d'explorer les technologies de conteneur telles que Kubernetes, Silverblue ou Flatpak, et voyez ce que vous pouvez faire avec les applications conteneurisées. Les conteneurs sont Linux, alors démarrez-les, inspectez-les attentivement et apprenez au fur et à mesure.


Linux
  1. Qu'est-ce que Podman et comment installer Podman sous Linux

  2. 6 ressources et 3 conseils pour vous aider à entrer dans le monde des conteneurs Linux

  3. Quelle est la différence entre un conteneur Linux et une image ?

  4. Linux - Comment répertorier les espaces de noms sous Linux ?

  5. Linux - Qu'est-ce qu'un espace de noms Uts ?

Mon terminal Linux riche en fonctionnalités et minimal

Introduction à la gestion des conteneurs Linux

Le noyau Linux et ses fonctions

Installer et configurer Ansible sous Linux

Installer et configurer Jenkins sous Linux

Comment installer et configurer les conteneurs Linux LXC sur CentOS / RHEL / Ubuntu