Image mise en avant pour l'article

Container, the hard way : un voyage à travers la complexité des conteneurs

5 août 2024
Bonnes pratiques - PHP
Le 24 mai dernier, lors de l’AFUP Day 2024 à Nancy, j’ai eu l’opportunité d’assister à une conférence très intéressante qui a su démystifier un sujet au cœur de l’innovation technologique : les conteneurs. Julien Redel, le speaker de cette session, nous a guidés à travers les subtilités de la haute disponibilité avec Docker et Kubernetes, révélant les complexités cachées derrière ces outils pourtant si populaires.


Les conteneurs ont véritablement transformé notre manière de concevoir, développer, déployer et gérer des applications. Offrant portabilité, isolation et optimisation des ressources, ils ont révolutionné la gestion des infrastructures IT. Cependant, derrière la simplicité apparente des outils comme Docker se cache une complexité technique notable.

À travers cet article, je reviendrai sur les points forts de la présentation de Julien Redel et explorerai avec vous cette complexité, en mettant l’accent sur la haute disponibilité avec Docker et Kubernetes et en abordant les différents mécanismes sous-jacents qui rendent ces technologies puissantes mais difficiles à maîtriser. Avant de commencer, je souhaite remercier, une nouvelle fois, Julien Redel pour avoir partagé son savoir sur cette fascinante thématique.

Sur la photo, nous voyons un fond noir avec des arcs de cercle bleus et des éléments de code

Adoption et haute disponibilité des conteneurs

L’adoption des conteneurs a profondément modifié la gestion des applications. Pour assurer une disponibilité maximale, il est essentiel de comprendre et de maîtriser des outils comme Docker et Kubernetes.

Haute disponibilité et Docker

La haute disponibilité est cruciale pour garantir l’accessibilité des applications, même en cas de panne. Par son Design, Docker facilite cette tâche en permettant de déployer des conteneurs rapidement et de les distribuer efficacement sur plusieurs nœuds. Cependant, orchestrer ces conteneurs pour garantir la haute disponibilité nécessite des solutions comme Kubernetes.

La CNCF et la croissance des conteneurs

La Cloud Native Computing Foundation (CNCF) joue un rôle clé dans la promotion et le soutien des technologies de conteneurs. Grâce à leur efforts, l'adoption des conteneurs a explosé, avec une utilisation croissante en production. Selon une étude de la CNCF datant de 2020, 92 % des entreprises utilisaient des conteneurs en production.

Kubernetes : le standard pour la production

Kubernetes est devenu la solution de facto pour déployer des conteneurs en production. Cependant, malgré ses avantages, Kubernetes est complexe à mettre en place et à gérer. Il nécessite une compréhension approfondie des concepts de clustering, de load balancing et de gestion des ressources.

Le load balancing dans Kubernetes joue un rôle crucial dans la gestion des applications, en s'assurant que le trafic réseau entrant est distribué de manière équitable entre les différentes instances d'une application.

Avantages et simplicité des conteneurs

Les conteneurs, avec leur promesse de portabilité et d'efficacité, simplifient considérablement le développement et le déploiement des applications. Mais comment Docker et d’autres technologies facilitent-ils ces processus ? Pour quels avantages ? Je vous dis tout !

La Simplicité de Docker

Docker, souvent décrit comme la « voie facile » pour les développeurs, simplifie la création, le déploiement et la gestion des conteneurs. Docker encapsule les applications et leurs dépendances dans une image, garantissant ainsi portabilité et reproductibilité.

Les conteneurs Docker peuvent être configurés pour exposer des ports et charger des variables en fonction du contexte d'exécution, facilitant le déploiement dans différents environnements. En figeant un état, Docker permet de conserver le code, les dépendances systèmes, les ports exposés et toutes les configurations souhaitées par le développeur.

La possibilité de faire un rollback, revenir à une version précédente de l’image, permet de restaurer rapidement un état stable, minimisant les interruptions de service.

Portabilité et optimisation des ressources

Les conteneurs offrent une portabilité exceptionnelle, garantissant une reproductibilité fiable et permettant leur déploiement sur n'importe quel système d'exploitation, y compris dans des environnements inhabituels comme dans les voitures de Mercedes.

Cette portabilité est accompagnée d'une optimisation des ressources, permettant de consommer uniquement ce qui est nécessaire. Par exemple, les environnements de recette peuvent être activés uniquement pendant les heures de travail, économisant ainsi des ressources.

Facilité de gestion des stacks de développement

Les conteneurs simplifient également la gestion des stacks de développement. Avec des outils comme DevContainer dans Visual Studio Code (VSCode), les développeurs peuvent configurer des environnements de développement complets et prêts à l'emploi.

Un DevContainer contient tout ce qui est nécessaire pour commencer à travailler. Cette approche facilite l'onboarding des nouveaux développeurs et assure la cohérence des environnements de développement.

Gestion et Complexité des Conteneurs

Bien que les conteneurs simplifient de nombreux aspects du développement et du déploiement d'applications, leur gestion présente des défis techniques importants. Mais pas de panique, je vais aborder ces différents points de manière détaillée.

Isolation et Sécurité

Les conteneurs assurent une isolation stricte des applications. Si une application est compromise, elle ne peut pas infecter le reste du serveur. Ce qui garantit une meilleure sécurité de l’application. Cette isolation est gérée par des namespaces Linux, qui séparent les processus, les réseaux et autres ressources.

Communication et Gestion des ressources

La communication entre le host et les conteneurs est essentielle. Les conteneurs sont traités comme des processus Linux normaux, mais bénéficient d’une gestion stricte des ressources grâce aux cgroups. Cette gestion limite l'utilisation du CPU et de la mémoire, garantissant que le host maintienne ses performances, et ceux même en cas de surcharge des conteneurs.

Schéma illustrant comment les conteneurs sont traités comme des processus Linux

Namespaces IPC et UTS

Les namespaces IPC (Inter-Process Communication) sont utilisés pour isoler les communications entre les processus de différents conteneurs, empêchant ainsi une application malveillante ou compromise de communiquer avec les processus d'autres conteneurs.

Le namespace UTS (UNIX Timesharing System) permet de séparer les informations sur le nom de l'hôte et le domaine, offrant une isolation supplémentaire.

Isolation des processus avec PID

Le namespace PID assure que chaque conteneur possède son propre arbre de processus isolé. Qu’est-ce que ça signifie ? Les processus dans un conteneur ne peuvent ni voir ni interagir avec ceux d’autres conteneurs ou de l'hôte.

Pour éviter les conflits de PID, l'hôte mappe les PID des conteneurs, s’assurant que chaque conteneur fonctionne de manière indépendante.

Supervisord et Gestion des entrées

Supervisord est souvent utilisé pour gérer les processus d'entrée au sein des conteneurs Docker. Il supervise et contrôle l'exécution des processus, redémarrant ceux qui échouent et assurant une gestion efficace des services à l'intérieur des conteneurs.

Les challenges des Runtimes

Gérer manuellement les mécanismes sous-jacents des conteneurs, comme les namespaces et les cgroups, est complexe. C'est pourquoi des runtimes comme Docker et Kubernetes existent pour simplifier ce processus. Toutefois, cette facilité apparente dissimule une complexité importante, qui exige une compréhension approfondie pour optimiser et sécuriser les déploiements.

Images et Stockage

La gestion des images de conteneurs introduit une complexité supplémentaire : chaque image est constituée de plusieurs couches, et toute modification invalide des couches suivantes, impactant le temps de build et la gestion des versions.

Les conteneurs utilisent des network namespaces pour isoler les réseaux et des volumes pour la persistance des données.

Outils et alternatives

Docker desktop est une machine virtuelle ultra légère utilisant docker engine API et middleware. Mais attention cette solution est soumise à une licence. Des alternatives comme Rancher Desktop offrent des options de gestion de conteneurs, avec leurs propres avantages et inconvénients.

Commet souvent, le choix d’un outil dépend des besoins spécifiques et des préférences de l'équipe de développement.

Ce qu'il faut retenir ! Bien que les conteneurs soient puissants, leur complexité ne doit pas être sous-estimée. Docker et Kubernetes facilitent leur utilisation, mais une compréhension approfondie des mécanismes sous-jacents est essentielle pour exploiter pleinement leur potentiel. En maîtrisant ces technologies, les entreprises peuvent bénéficier d'une flexibilité, d'une scalabilité et d'une sécurité accrue, tout en assurant une haute disponibilité de leurs applications.

Pour aller plus loin et vous entraîner, je vous conseille le blog d’Ivan Velichko.

Poursuivez votre lecture avec les articles de mes sur les conférences de l'« Afup day 2024 », je vous invite à les découvrir :

Crédit photo : greatph

Image mise en avant pour l'article
Christophe Pétré
Développeur Web • Pôle Framework & DevOps
Quelle technologie choisir pour votre projet digital ?
Drupal, Symfony, WordPress..., nos experts vous conseillent la meilleure solution technique pour votre projet
Contactez-nous !