Aller jusqu'à contenu principal

Qu'est-ce qu'un conteneur?

· 7 minutes de lecture
What is a Container

Salut! Aujourd'hui, on va parler de deux choses:

  1. la dernière mise à jour de la librairie Docusaurus qui me permet désormais de te fournir mon blog en deux langues!
  2. les conteneurs et leur utilité dans le cadre du développement d'applications.

Un simple petit rappel: les opinions exprimées ici sont strictement les miennes. Elles ne représentent pas les opinions ou vues de mon employeur actuel ni aucun des précédents.

Docusaurus

Qu'est-ce que c'est?

Docusaurus, c'est un générateur de sites web optimisés open-source qui embarque plusieurs fonctionnalités intéressantes pour les créateurs de contenu en ligne:

  • documentation et articles de blog en Markdown ;
  • multi-linguisme ;
  • versionage ;
  • recherche de contenu fortement développée (grâce à une intégration d'Algolia).

Pourquoi Docusaurus?

En effet, la question peut se poser. Pourquoi Docusaurus alors qu'il existe d'autres générateurs de sites comme Wix, Shopify, Weebly, ... ou plus axés développeur comme Next.js, Hugo, Gatsby, etc.

Je suis tombé sur Docusaurus par pur hasard en cherchant un générateur de documentations spécifique à .NET (Docfx d'ailleurs, si ça t'intéresse). Cependant, j'ai personnellement choisi Docusaurus pour mes projets personnels pour 3 raisons: il est...

  • open-source (ce qui signifie que je peux y contribuer, consulter son code source, etc.),
  • développé en React (j'aime beaucoup de cette librairie),
  • facilement utilisable (en 2-3 minutes, tu peux avoir un site fonctionnel et personnalisé).

Ce site web est généré avec Docusaurus

Si tu ne l'as pas encore remarqué, ce site web est généré avec Docusaurus. Tu peux d'ailleurs retrouver les sources sur Github. Si tu vois une faute, n'hésitez pas à le mentionner en ouvrant une issue!

Passons au sujet principal maintenant! Notre introduction aux conteneurs (ou containers en anglais).

Les conteneurs

De quoi parle-t-on?

Un des problèmes dans le développement, c'est qu'on est fortement liés à la machine sur laquelle tourne notre produit. Que cela soit en plein développement, ou quand il s'agit de distribuer un service web à des clients, il y a toujours une machine quelque part. Et le soucis principal, c'est que les systèmes et leurs configurations diffèrent..!

It Works On My Machine - meme

Tu l'auras compris. Un conteneur, c'est une unité logiciel qui embarque du code et toutes ses dépendances afin de faire tourner une application d'un environnement à l'autre de manière rapide et fiable. C'est comme si, finalement, tu envoyais ton propre ordinateur au client.

Quelles différences avec une Machine Virtuelle?

Il est vrai que les conteneurs sont souvent comparés aux machines virtuelles (en anglais, virtual machine (VM)) en ça qu'ils ont tous deux le même but: faire tourner une application dans un environnement embarqué. La grosse différence entre les 2, c'est qu'un conteneur fait appel au système d'exploitation (en anglais, operating system (OS)) du serveur hôte tandis qu'une VM héberge son propre OS.

En fait, une machine avec Docker installée apporte les avantages suivants:

  • légèreté et rapidité,
  • portabilité et standardisation, donc multi-plateforme (dans une certaine mesure).

En réalité, c'est compréhensible. Regardons de plus près à ce schéma:

Container VS Virtual Machine

Ce schéma est une comparaison d'une machine avec Docker installé et d'une machine qui instancie et gère des VMs. Grâce à mon extraordinaire talent de dessinateur, on peut vite comprendre pourquoi Docker propose légèreté et rapidité comme atout: Docker se base sur l'OS installé et réutilise les binaires. Cela signifie que la machine n'a plus qu'à charger les conteneurs qui embarquent le code, les variables d'environnement, etc. (donc peu de choses lourdes à proprement parler).

A contrario, un système qui se base sur les VMs possède un hyperviseur, qui va gérer les différentes VMs. Cet hyperviseur se base en effet sur l'OS de la machine hôte. Cependant, chaque VM embarque elle-même son propre OS et ses binaires.

En conclusion donc, on peut avoir une machine qui fait facilement tourner 500 conteneurs avec un seul OS. Mais ce ne sera pas la même histoire si on doit faire tourner 500 VMs... Même si, en réalité, il reste complexe de gérer de façon efficiente plusieurs conteneurs en simultané.

Pourtant, la force de Docker peut également se révéler une faiblesse : il n'est pas possible de faire tourner un conteneur qui dépend de Windows sur une machine Linux (et inversément).

Un autre problème important qui se pose lors de l'utilisation de Docker est évidemment la sécurité! Les conteneurs ont beau être isolés... si un seul est compromis, il est fort à parié que l'entièreté de la machine (et donc tous les autres conteneurs) représente un risque.

Comment ça fonctionne?

Je vais poser les bases, histoire qu'on parle avec le langage. On va parler de Docker spécifiquement. Il se compose de 3 parties distinctes:

  1. le logiciel, appelé Docker daemon, est un processus qui gère les conteneurs Docker et les objets en résultant (ex: Docker Engine, ...)
  2. les objets, divisés eux-mêmes en 3 catégories, sont des entités qui permettent de construire une application dans Docker:
    • un conteneur est un environnement standardisé qui contient les applications.
    • une image est un modèle en lecture seule qui permet de générer un conteneur. On peut donc dire que l'instance d'une image est un conteneur.
    • un service est un système qui permet d'orchestrer les opérations de plusieurs conteneurs gérés par plusieurs daemons. Ça porte aussi le nom de Swarm (un ensemble de Docker daemons qui communiquent entre eux grâce à Docker - ex: Docker Swarm, Kubernetes, ...).
  3. les registres sont des entrepôts pour les images Docker (ex: Docker Hub, Google Cloud Platform, ...)

Pour créer un conteneur, il faut respecter quelques principes:

  • un conteneur ne contient qu'un seul processus ;
  • un conteneur est immutable (ça signife qu'avec les mêmes variables d'environnement, le conteneur tournera le même processus) ;
  • un conteneur est disposable (ça signifie qu'on peut le supprimer, le remplacer, etc. comme on veut).

Ces 3 principes ne sont que les plus importants selon moi, mais tu trouveras la méthodologie complète sur le site "The Twelve Factors".

Une fois une image récupérée depuis un registre ou construite localement, tu peux créer un conteneur. Je te le montrerais bien, mais comme je ne réinvente pas la roue, tu trouveras une petite vidéo qui explique pas mal ces principes-ci!

Pourquoi utiliser Docker ou ses concurrents?

Le principe de conteneurisation amène différents avantages considérables. En voici une petite liste non-exhaustive:

  • embarquement de nouvelles ressources humaines plus rapide et facile ;
  • certitude de travailler dans le même environnement que ses collègues (même version des outils notamment) ;
  • application du principe "Do Not Reinvent The Wheel" puisqu'un accès aux images open-source est possible ;
  • plus grande rapidité de compilation et de destruction en comparaison à une VM ;
  • environnement cohérent et isolation ;
  • grande compatibilité (l'OS de la machine de dev importe peu, donc tout le monde peut travailler sur son poste préféré).

Conteneuriser ses applications est de plus en plus courant. On peut d'ailleurs trouver une raison à cette évolution dans la croissance que subit le mouvement DevOps.

Conclusion

Si tu n'as de cesse d'avoir des problèmes de configuration d'environnement, que tu dois toujours attendre au moins 1 semaine pour déployer un test dans un environnement client, que c'est toujours compliqué d'embarquer de nouveaux collègues sur un projet... alors considère peut-être l'emploi de conteneurs dans ton quotidien. Cela dit, je t'avoue que nous n'avons que gratter la surface des possibilités qu'offre Docker. Je te conseille vivement de continuer à te documenter.

Et si tu cherches à générer de la documentation en ligne ou à écrire un blog, tu peux aussi essayer Docusaurus! 😁

Reste à jour, inscris-toi à ma newsletter!