Les différences entre la virtualisation et la conteneurisation

Cet article vous explique en détail, les différences entre la virtualisation et la conteneurisation. Vous comprendrez ainsi pourquoi la technologie Docker est devenue si prisée.

Introduction

Pour comprendre pourquoi la technologie Docker est devenue de nos jours si populaire que ça, il est important d'abord de comprendre quel est l'intérêt des conteneurs en le comparant à la virtualisation.

Commençons d'abord par expliquer le fonctionnement de la virtualisation.

La virtualisation

Le fonctionnement de la virtualisation

Le fonctionnement de la virtualisation reste assez simple, c’est qu’au lieu d’avoir un serveur avec un système d’exploitation faisant tourner une ou plusieurs application(s), on préférera mutualiser plusieurs serveurs virtuels depuis un serveur physique grâce à un logiciel nommé l’hyperviseur. L’hyperviseur permet d’émuler intégralement les différentes ressources matérielles d'un serveur physique (tels que l'unité centrale, le CPU, la RAM, le disque dur, carte réseau etc ...), et permet à des machines virtuelles de les partager.

Ainsi ces machines virtuelles nommées aussi VM (Virtual Machine) bénéficieront de ressources matérielles selon leurs besoins (par exemple plus de puissance processeur et plus de mémoire vive mais avec moins d’espace disque). L'avantage c'est qu'il est possible de modifier les ressources physiques de ces VMs en quelques clics. De plus elles possèdent leur propre système d’exploitation ainsi que leurs propres applications.

Schema du fonctionnement de la virtualisation avec un hyperviseur

Les avantages de virtualisation

  • Consacrer les ressources adaptées selon les applications qu'on souhaite mettre en place.
  • Les machines virtuelles reste simples à manier. Il est possible par exemple de basculer une VM d'un lieu à l'autre voir même de sauvegarder et de dupliquer une VM à volonté sans aucun impact visible pour les utilisateurs.
  • La virtualisation réduit les dépenses en abaissant le besoin de systèmes matériels physiques. Elle permet ainsi de réduire la quantité d'équipement nécessaire et les coûts de maintenance d'alimentation et de refroidissement des composants.
  • Les machines virtuelles apportent également une aisance à l'administration car un matériel virtuel n'est pas sujet aux défaillances. Les administrateurs profitent des environnements virtuels pour faciliter les sauvegardes, la reprise après catastrophe.

Les inconvénients de la virtualisation

  • Le fait d’accéder aux ressources de façon virtuelle affaiblie les performances, cela est dû car on passe par une couche d’abstraction matérielle qui malheureusement doit faire des interprétations entre le matériel en place et celui simulé dans la machine virtuelle.
  • Comme éxpliqué plus haut la virtualisation consiste à faire fonctionner sur un seul ordinateur physique plusieurs VMs avec différents systèmes d'exploitation, comme s'ils fonctionnaient sur des ordinateurs distincts. Mais malheureusement cette couche d'OS consomme à lui tout seul énormément de ressources alors qu’au final, ce qui nous intéresse c’est la ou les applications qui vont tourner dessus.

Conclusion

On se trouve alors avec une technologie très utile, malléable et économique pour les professionnels, mais malheureusement elle possède aussi son lot d’inconvénients, heureusement que d’autres personnes ont pensé à aller encore plus loin, et d’être encore plus efficace, et pour cela, la conteneurisation a été crée et par la suite la technologie Docker a permis de la populariser.

La conteneurisation vs virtualisation

Information

L'utilisation de conteneurs Linux pour déployer des applications s'appelle la conteneurisation.

L'isolation

Dans le cas de la virtualisation l’isolation des VMs se fait au niveau matérielles (CPU/RAM/Disque) avec un accès virtuel aux ressources de l'hôte via un hyperviseur. De plus, généralement les ordinateurs virtuels fournissent un environnement avec plus de ressources que la plupart des applications n'en ont besoin.

Par contre dans le cas de la conteneurisation, l’isolation se fait au niveau du système d’exploitation. Un conteneur va s'exécuter sous Linux de manière native et va partager le noyau de la machine hôte avec d'autres conteneurs. ne prenant pas plus de mémoire que tout autre exécutable, ce qui le rend léger.

L’image ci-dessous illustre cette phase d’abstraction de l’OS.

Schema du fonctionnement de la virtualisation
Schema du fonctionnement de la conteneurisation

Avantages de la conteneurisation par rapport à la virtualisation traditionnelle

  • Comme vu plus haut les machines virtuelles intègrent elles-mêmes un OS pouvant aller jusqu’à des Giga-octets. Ce n'est pas le cas du conteneur. Le conteneur appel directement l'OS pour réaliser ses appels système et exécuter ses applications. Il est beaucoup moins gourmand en ressources
  • Le déploiement est un des points clés à prendre en compte de nos jours. On peut déplacer les conteneurs d’un environnement à l’autre très rapidement (en réalité c'est encore plus simple et rapide avec Docker, car il suffit juste de partager des fichiers de config qui sont en général très légers). On peut bien sur faire la même chose pour une machine virtuelle en la déplaçant entièrement de serveurs en serveurs mais n'oubliez pas qu'il éxiste cette couche d'OS qui rendra le déploiement beaucoup plus lent, sans oublier le processus d'émulation de vos ressources physiques, qui lui-même demandera un certain temps d'exécution et donc de la latence en plus.

Information

La virtualisation reste tout de même une technologie profitable qui a encore de beaux jours devant elle. Pour rappel nous avons besoin d'une machine avec un OS pour faire tourner nos conteneurs. Je vais me répéter mais pour moi ça reste une notion très importante, la conteneurisation permet d'optimiser l'utilisation de vos ressources tout en profitant des avantages qu'offre la virtualisation.

Les avantages de conteneurisation

La conteneurisation est de plus en plus populaire car les conteneurs sont :

  • Flexible: même les applications les plus complexes peuvent être conteneurisées.
  • Léger: les conteneurs exploitent et partagent le noyau hôte.
  • Interchangeable: vous pouvez déployer des mises à jour à la volée
  • Portable: vous pouvez créer localement, déployer sur le cloud et exécuter n'importe où votre application.
  • Évolutif: vous pouvez augmenter et distribuer automatiquement les réplicas (les clones) de conteneur.
  • Empilable: Vous pouvez empiler des services verticalement et à la volée.

Pourquoi Docker est si populaire ?

La conteneurisation est loin d'être une technologie récente. En réalité les conteneurs ne sont pas si nouveaux que ça, comme on pourrait le croire. Je peux en citer quelques technologies comme Chroot sur Unix (1982), Jail sur BSD (2000), conteneurs sur Solaris (2004), LXC (Linux conteneurs) sur Linux (2008). La célébrité de docker vient du fait qu'il a su permettre aux utilisateurs de gérer facilement leurs conteneurs avec une interface en ligne de commande simple.

Les conteneurs ne sont pas nouveaux, mais leur utilisation pour déployer facilement des applications l'est.

Hors de ce cours pour s'amuser un peu, on aura l'occasion sur d'autres articles de créer un conteneur Linux en utilisant des fonctionnalités nativement disponible sur Linux 😊.

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

29 commentaires

ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Content que ça aide. Oubliez pas de toujours inspecter vos images avec docker history pour voir ce qui pèse lourd dans les couches.

10/06/2019 à 10:14
leon-gomes
Membre Actif
Avatar de leon-gomes
leon-gomes
Membre Actif

Merci pour l'article, c'est bien plus digeste que la doc officielle.

10/06/2019 à 04:15
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

C'est l'architecture CPU, oui. Ton image est construite en ARM64, ton serveur est en AMD64. Faut build avec buildx.

docker buildx build --platform linux/amd64 -t mon-image .

Ça règle le souci de compatibilité.

09/06/2019 à 23:44
noel-caron
Membre Actif
Avatar de noel-caron
noel-caron
Membre Actif

J'ai une erreur exec format error quand je lance une image créée sur mon Mac M1 sur un serveur Intel. C'est normal ?

09/06/2019 à 19:21
verdier-eugene
Membre Actif
Avatar de verdier-eugene
verdier-eugene
Membre Actif

Le chroot mentionné dans l'article, c'est vraiment l'ancêtre ?

09/06/2019 à 13:14
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise COPY dans 99% des cas. ADD fait des trucs bizarres comme extraire les tarballs automatiquement, ce qui est souvent source de bugs.

09/06/2019 à 08:29
clement-raymond
Membre Actif
Avatar de clement-raymond
clement-raymond
Membre Actif

C'est quoi la différence entre COPY et ADD dans un Dockerfile ?

09/06/2019 à 00:57
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise les flags de limitation au démarrage. Indispensable pour éviter le OOM killer sur l'hôte.

docker run --memory="512m" --cpus="1.0" mon-image

C'est la base de la bonne gestion des ressources en conteneurisation.

08/06/2019 à 20:54
nicolas25
Membre Actif
Avatar de nicolas25
nicolas25
Membre Actif

Comment je peux limiter la RAM d'un conteneur ? Il pompe tout le serveur là.

08/06/2019 à 14:44
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise le prune, c'est fait pour ça.

docker container prune
docker image prune -a

Attention : ça supprime tout ce qui n'est pas actif.

08/06/2019 à 07:52
paubert
Membre Actif
Avatar de paubert
paubert
Membre Actif

C'est quoi la commande pour nettoyer les conteneurs arrêtés ? Ça s'accumule et ça bouffe mon disque.

08/06/2019 à 02:08
richard98
Membre Actif
Avatar de richard98
richard98
Membre Actif

Merci pour l'explication sur le noyau partagé. Ça explique pourquoi on peut pas faire tourner du Windows dans un conteneur Linux sans une couche de virtualisation lourde.

07/06/2019 à 18:09
gautier-laetitia
Membre Actif
Avatar de gautier-laetitia
gautier-laetitia
Membre Actif

J'ai essayé de conteneuriser une appli legacy qui tourne sur un vieux noyau, ça plante direct. C'est mort ?

07/06/2019 à 11:57
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

@guerriernumerique courage  😀 !

07/06/2019 à 08:07
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise docker logs -f pour le debug immédiat. Pour la prod, envoie tout vers un driver de log type syslog ou json-file avec rotation.

{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}}

Faut mettre ça dans /etc/docker/daemon.json.

07/06/2019 à 07:19
honore-leroux
Membre Actif
Avatar de honore-leroux
honore-leroux
Membre Actif

Super clair le comparatif. Par contre, pour les logs, c'est quoi le mieux ? Je galère à parser les sorties dans les conteneurs.

07/06/2019 à 01:22
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Ajoute ton utilisateur au groupe docker, mais attention : c'est équivalent à un accès root sur la machine.

sudo usermod -aG docker $USER

Pense à te déconnecter/reconnecter pour que le changement soit pris en compte.

06/06/2019 à 18:55
anastasie-navarro
Membre Actif
Avatar de anastasie-navarro
anastasie-navarro
Membre Actif

Moi j'ai un problème de droits sur le socket /var/run/docker.sock. Je dois toujours faire sudo pour lancer mes commandes, c'est lourd.

06/06/2019 à 14:20
guerriernumerique
Membre Rédacteur
Avatar de guerriernumerique
guerriernumerique
Membre Rédacteur

Cava jusqu'eu la je suis 😅😅😅

06/06/2019 à 11:20
matthieu-bonnin
Membre Actif
Avatar de matthieu-bonnin
matthieu-bonnin
Membre Actif

L'article mentionne LXC. C'est encore utilisé en prod ou c'est devenu obsolète avec la montée en puissance de Docker ?

06/06/2019 à 07:20
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

T'es probablement en bridge par défaut. Crée un réseau spécifique pour tes conteneurs, c'est bien plus propre.

docker network create mon-reseau
docker run --network mon-reseau mon-app

Ça active le DNS interne, ils se pingueront par le nom du conteneur.

06/06/2019 à 03:11
Anonyme
Membre
Avatar de
Membre

Amurer -> amuser

05/06/2019 à 23:58
dorothee81
Membre Actif
Avatar de dorothee81
dorothee81
Membre Actif

J'ai un souci de réseau. Mes conteneurs ne se voient pas alors qu'ils sont sur le même host. Une piste ?

05/06/2019 à 19:13
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

@Aster, bien vu ;)

05/06/2019 à 19:03
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Tu utilises les volumes Docker pour isoler tes données de la couche inscriptible du conteneur.

docker run -d -v /mon/chemin/host:/app/data mon-image

C'est basique mais ça évite de perdre tes datas à chaque docker rm.

05/06/2019 à 14:27

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire