Quelles sont les principales différences entre la virtualisation et la conteneurisation ?
Alors on entend beaucoup parler de virtualisation, de machines virtuelles, de conteneurs, de conteneurisation mais rares sont les personnes qui comprennent les différences.
La virtualisation c’est reproduire le plus fidèlement possible un ordinateur (ou une machine physique) en une machine virtuelle. Il existe deux façons de faire de la virtualisation :
- La première consiste à l’installation d’un “système d'exploitation” qui va permettre de diviser son ordinateur en plusieurs ordinateurs virtuels.
- La deuxième consiste à installer un logiciel sur son système d’exploitation et de créer des machines virtuelles. Ce type de logiciel s'appelle des hyperviseurs.
Alors que la conteneurisation informatique, contrairement à la virtualisation, ne va pas reproduire une machine physique mais utiliser la machine avec son système d'exploitation. Donc, la conteneurisation consiste à isoler les utilisateurs, les processus, les systèmes de fichiers sur un même système d'exploitation. Un peu comme si vous aviez plusieurs sessions utilisateurs ouvertes et utilisables en même temps. Pour la conteneurisation on va utiliser un logiciel, un gestionnaire de conteneurs qui va s’occuper du cycle de vie des conteneurs mais aussi de la communication entre le système hôte et les conteneurs.
Quel est l’intérêt de la conteneurisation par rapport à la virtualisation ?
Dans les projets web, les services de conteneurs permettent d’avoir une cohérence d’environnement sur l’ensemble des machines, que ce soit celle d’un développeur, d’un client ou de la chaîne de production. Cela répond à l’éternelle question qu’on entendait tout le temps et qu’on peut parfois encore entendre “Je comprends pas, sur mon PC ça fonctionne”. Grâce aux technologies des conteneurs vous pouvez partager un écosystème isolé au sein de systèmes différents.
Par exemple si on prend la situation suivante :
Si le développeur met à jour son environnement ou un outil et que le code qu’il fournit au SysAdmin n’est plus compatible avec les serveurs alors ça ne fonctionnera pas. Le développeur va dire que ça fonctionne sur son poste et la manager ne pourra rien faire car il n’a les ressources, ni d’environnement prêt pour test sur son poste.
Une solution serait que tout le monde utilise le même système d’exploitation et les mêmes versions d’outils mais c’est compliqué à mettre en place.
Une autre solution serait d’installer une machine virtuelle et que tout le monde installe les mêmes systèmes d’exploitation et les mêmes versions d’outils. Pareil, c’est une solution difficile à mettre en place.
Dernière solution avec les conteneurs, c’est que le SysAdmin et le développeur se mettent d’accord sur la version des outils de développement, créent une image et que celle-ci soit utilisée par tout le monde. Je reviendrai plus en détail après sur le concept d’image.
La conteneurisation contrairement à la virtualisation permet de partager rapidement un écosystème entre plusieurs collaborateurs sans devoir mettre en œuvre des solutions lourdes.
En résumé, en utilisant les services de conteneurs, on supprime la différence entre les différents écosystèmes en isolant et partageant un environnement utilisant des versions, des ressources et des configurations de logiciel spécifiques. Même si la conteneurisation est basée sur des systèmes Linux, il est possible d’avoir une compatibilité avec les systèmes Mac OS et Windows.
Qu’est-ce que la conteneurisation avec Docker ?
Maintenant que l’on a vu la différence entre virtualisation et conteneurisation, on peut expliquer ce que c’est Docker.
Docker est un logiciel permettant la gestion de conteneurs. C’est aujourd’hui le leader du marché dans la conteneurisation. Au départ Docker a été développé pour un projet interne puis a été rendu open source en 2013. Docker s’appuie sur les technologies de l’isolation par conteneurisation Linux en simplifiant la mise en place.
Dans les concepts clés de Docker, on retrouve les Dockerfile, les images, les conteneurs, les dépôts de conteneur, les volumes et le réseau. Je vais vous parler plus en détail des concepts d’image et des dépôts de conteneur.
L’image Docker |
Le conteneur |
Le dépôt de conteneur |
Une image docker c’est une représentation à un instant T d’un écosystème d’un système d’exploitation, de logiciel et de configuration, portable et partageable. C’est comme si l’on prenait une photo d’un objet et qu’on la partageait à plusieurs personnes. Une image va être construite à l’aide d’un manifeste (fichier) que l’on appelle Dockerfile. |
Le conteneur c’est une instance exécutable d’une image Docker. Si on reprend notre exemple de photo, le conteneur serait la représentation physique de l’image, c’est un peu une impression de cette image. L’image va utiliser une partie des ressources de la machine physique. |
Le dépôt de conteneur ou container registry en anglais est un espace de stockage ou l’on peut y déposer l’image docker. D’ailleurs on devrait appeler ça un dépôt d’image. Cela va se matérialiser comme un dépôt de code Git mais à la place c’est un dépôt d'image docker. Lorsque l’on crée une image on va pouvoir la diffuser au monde entier grâce au container registry mais aussi à un public plus restreint si on utilise des solutions privées comme un Docker Registry privé. L’objectif c’est d’avoir des outils portables sur toutes les plateformes (Windows, Mac OS et Linux). Le dépôt de conteneur office est Docker hub. |
As-tu déjà utilisé des images Docker dans un dépôt public ?
Oui, c’est très courant. On utilise beaucoup les images communautaires, notamment celles créées par les créateurs de langages comme NodeJS, PHP, Java, Golang, Rust... L’ensemble d’entre eux mettent à disposition des images Docker comprenant le “runtime” prêt à exécuter du code pour notre application. Il nous arrive aussi d’utiliser des images de certaines distributions Linux suivant notre besoin.
En tant que DevOps, on part quasiment toujours d’une image créée par le langage par facilité et par simplicité. Cela nous évite beaucoup de maintient et problèmes liés à la sécurité.
Dans certains cas on ne va faire aucune modification de l’image mise à disposition et d’autre fois on va rajouter notre couche pour s’adapter à notre environnement et code.
Peut-on utiliser la conteneurisation et la virtualisation conjointement ?
Complètement oui, ce n’est pas du tout incompatible ! Aujourd’hui, on peut avoir plusieurs machines virtuelles sur une machine physique puis sur chaque machine virtuelle avoir plusieurs conteneurs.
Je ne sais pas exactement comment sont mises en place certaines solutions cloud mais la virtualisation est fortement utilisée dans les datacenters et dans toutes ces machines virtuelles vous trouverez sûrement plusieurs conteneurs.
Le cas d’usage de la virtualisation et conteneurisation le plus courant est lorsque pour louer un serveur ou VPS (Virtual Private Server) à un fournisseur et hébergeur Cloud tel que OVH, Scaleway ou encore AWS, vous exécutez un ou plusieurs conteneurs sur cette machine.
Envie d’en savoir plus sur Docker ?
Téléchargez notre cheat sheet avec toutes les commandes Docker
Téléchargez notre outilDe ton expérience, quels sont les inconvénients de Docker ? Est-ce adapté à tous types d’environnements ?
Pour moi, l’inconvénient majeur de Docker c’est le manque de connaissance sur les systèmes Linux et sur l’interface en ligne de commande. Cela peut apporter de la frustration auprès des développeurs qui vont avoir du mal à adhérer aux concepts de la conteneurisation. Ils ne comprennent pas l'utilité, ainsi que le fonctionnement et ils vont considérer Docker comme une boîte noire.
Dès que Docker fonctionne plus ou qu’une difficulté se présente, les développeurs vont avoir tendance à réinstaller les langages de programmation sur leur machine physique. On perd donc l’harmonisation que l’on cherche avec la conteneurisation.
Donc finalement ce n’est pas vraiment un inconvénient de Docker mais plutôt un problème de manque de formation et d’évangélisation des équipes de développement. Personnellement, je ne trouve aucun inconvénient à sa mise en place et son utilisation. Par ailleurs, la solution est mature, stable et approuvée par les plus grands groupes d’aujourd’hui. Ça se voit notamment par le manque de concurrents sérieux à Docker.
La conteneurisation à été développé à partir du noyau Linux donc pas de problème de compatibilité pour les distributions Linux. Pour Mac OS ça va aussi car Linux et Mac OS partagent un historique commun qui est UNIX. Pour Windows le début était plus compliqué mais beaucoup de progrès ont été faits de la part de Microsoft notamment avec WSL2.
Docker a simplement vulgarisé l'utilisation de l'isolation par conteneurisation en la rendant plus simple et rapide.
Par où doivent commencer les entreprises qui cherchent à mettre en place la conteneurisation Docker sur leur infrastructure ?
La solution de conteneurisation va plus s’appliquer à des entreprises qui évoluent vite et qui voient arriver des contraintes d'harmonisation d'environnements. Mais aussi des structures qui cherchent à faire du déploiement rapide et continu, à scaler pour avoir une haute disponibilité et performance de leurs environnements. Et surtout pour des architectures microservices avec une diversité de langages et de versions.
Avant de se lancer dans l'expérience de la conteneurisation et de Docker, il ne faut pas hésiter à se documenter, à se former et à faire un ou plusieurs POC. Une fois la glace brisée avec Docker, vous pouvez alors commencer.
Après, comme dans la majorité des cas pour une nouvelle technologie, il est préférable de le faire sur un nouveau projet, puis de migrer les projets un par un une fois la technologie maîtrisée. N'hésitez pas à vous faire un plan de migration progressive par applications non critiques, plus simples ou plus récentes.
Une fois la première application conteneurisée et validée sur toutes les chaînes de production. Par chaîne de production, je veux parler de l'environnement local de développement, intégration continue et déploiement.
Techniquement, il n’y a pas de contrainte pour se lancer. Si ce n’est de privilégier les systèmes d’exploitation Linux ou Mac OS, car Docker est un noyau Linux, et d’éviter de le faire sur Windows pour le moment car cela pourrait engendrer plus de problèmes que de bénéfices.
Et Kubernetes dans tout ça ?
Déjà il faut savoir ce que c’est Kubernetes. Kubernetes est une plateforme open-source d’orchestration de conteneur. Cela signifie qu’avec Kubernetes vous allez pouvoir exécuter plusieurs conteneurs en même temps et surtout automatiser certaines tâches comme le redémarrage automatique en cas de problème, le nombre de conteneurs pour la disponibilité ou la gestion du trafic réseau et bien d'autres choses.
Concrètement, sans Kubernetes et si vous voulez utiliser plusieurs conteneurs, il faut lancer l’exécution de plusieurs lignes de commandes juste pour démarrer les conteneurs. Sans compter sur les nombreuses commandes pour la mise en réseau, la gestion de volume (espace disque), le monitoring, la sécurité et le management de toutes vos infrastructures conteneurisées. Kubernetes est la technologie idéale pour des infrastructures et architectures importantes.
Bref, Kubernetes va permettre l’exécution de pleins de tâches différentes qui simplifient la vie en production. Détailler le sujet mériterait un autre article complet car ça s’éloigne largement de la conteneurisation.
Conclusion : se lancer dans la conteneurisation Docker
Vous avez toutes les cartes en mains dorénavant pour comprendre les différences, les avantages et les inconvénients de la virtualisation et de la conteneurisation de vos applications.
Concernant la conteneurisation de votre application, lancez-vous ou faites-vous accompagner par des experts maîtrisant le sujet !
Nicolas Grévin
DevOps
@ Eleven Labs
Envie d’être accompagné dans la conteneurisation de vos applications ?
Organisons un échange !
Demander un rendez-vous