Docker utilisait initialement LinuX Containers (LXC), mais a ensuite basculé vers runC (anciennement connu sous le nom de libcontainer), qui s'exécute dans le même système d'exploitation que son hôte. Cela lui permet de partager beaucoup des ressources du système d'exploitation hôte. De plus, il utilise un système de fichiers en couches (AuFS) et gère le réseau.
AuFS est un système de fichiers en couches, vous pouvez donc avoir une partie en lecture seule et une partie en écriture qui sont fusionnées. On peut avoir les parties communes du système d'exploitation en lecture seule (et partagées entre tous vos conteneurs) puis donner à chaque conteneur son propre point de montage pour l'écriture.
Donc, disons que vous avez une image de conteneur de 1 Go; si vous vouliez utiliser une VM complète, vous auriez besoin de 1 Go x le nombre de VM que vous voulez. Avec Docker et AuFS, vous pouvez partager la majeure partie du 1 Go entre tous les conteneurs et si vous avez 1000 conteneurs, vous pourriez encore n'avoir qu'un peu plus de 1 Go d'espace pour l'OS des conteneurs (en supposant qu'ils exécutent tous la même image OS).
Un système virtualisé complet obtient son propre ensemble de ressources qui lui sont allouées et partage peu. Vous obtenez plus d'isolement, mais c'est beaucoup plus lourd (nécessite plus de ressources). Avec Docker, vous obtenez moins d'isolement, mais les conteneurs sont légers (nécessitent moins de ressources). Ainsi, vous pourriez facilement exécuter des milliers de conteneurs sur un hôte, et cela ne cillerait même pas. Essayez de le faire avec Xen, et à moins d'avoir un hôte très puissant, je ne pense pas que ce soit possible.
Un système virtualisé complet prend généralement des minutes pour démarrer, tandis que les conteneurs Docker/LXC/runC prennent des secondes, et souvent moins d'une seconde.
Il y a des avantages et des inconvénients pour chaque type de système virtualisé. Si vous voulez un isolement complet avec des ressources garanties, une VM complète est la voie à suivre. Si vous voulez simplement isoler les processus les uns des autres et exécuter un tas d'entre eux sur un hôte de taille raisonnable, alors Docker/LXC/runC semble être la voie à suivre.
Pour plus d'informations, consultez cet ensemble d'articles de blog qui expliquent bien le fonctionnement de LXC.
Pourquoi déployer un logiciel dans une image Docker (si c'est le terme approprié) est-il plus facile que de simplement déployer dans un environnement de production cohérent ?
Déployer un environnement de production cohérent est plus facile à dire qu'à faire. Même si vous utilisez des outils comme Chef et Puppet, il y a toujours des mises à jour de l'OS et d'autres éléments qui changent entre les hôtes et les environnements.
Docker vous donne la possibilité de mettre en snapshot l'OS dans une image partagée, et facilite le déploiement sur d'autres hôtes Docker. Localement, dev, qa, prod, etc. : toutes les mêmes images. Bien sûr, vous pouvez le faire avec d'autres outils, mais pas aussi facilement ou rapidement.
C'est idéal pour les tests; disons que vous avez des milliers de tests qui doivent se connecter à une base de données, et chaque test a besoin d'une copie prête de la base de données et apportera des modifications aux données. L'approche classique consiste à réinitialiser la base de données après chaque test, soit avec un code personnalisé soit avec des outils comme Flyway - cela peut prendre beaucoup de temps et signifie que les tests doivent être exécutés séquentiellement. Cependant, avec Docker, vous pourriez créer une image de votre base de données et exécuter une instance par test, puis exécuter tous les tests en parallèle car vous savez qu'ils seront tous exécutés contre le même instantané de la base de données. Comme les tests s'exécutent en parallèle et dans des conteneurs Docker, ils pourraient tous s'exécuter sur la même machine en même temps et devraient finir beaucoup plus rapidement. Essayez de faire cela avec une VM complète.
De commentaires...
Intéressant ! Je suppose que je suis toujours confus par la notion de "mettre en snapshot l'OS". Comment fait-on cela sans, bon, faire une image de l'OS ?
Eh bien, voyons si je peux expliquer. Vous commencez par une image de base, puis apportez vos modifications, et commitez ces modifications en utilisant Docker, et cela crée une image. Cette image ne contient que les différences par rapport à la base. Lorsque vous voulez exécuter votre image, vous avez également besoin de la base, et il superpose votre image sur la base en utilisant un système de fichiers en couches : comme mentionné ci-dessus, Docker utilise AuFS. AuFS fusionne les différentes couches ensemble et vous obtenez ce que vous voulez ; vous n'avez qu'à l'exécuter. Vous pouvez continuer à ajouter plus d'images (couches) et il continuera à sauvegarder uniquement les différences. Comme Docker se base généralement sur des images prêtes à l'emploi provenant d'un registre, vous avez rarement besoin de "mettre en snapshot" tout l'OS vous-même.
16 votes
Analyse des performances de Docker vs KVM : bodenr.blogspot.com/2014/05/…
1 votes
Si vous recherchez la différence entre leurs images - stackoverflow.com/questions/29096967/…
46 votes
Docker n'est pas une machine virtuelle - c'est un outil de gestion de configuration.
0 votes
Vous pouvez trouver des faits intéressants sur la mise en œuvre et l'isolement des conteneurs sur doger.io.
6 votes
En termes simples: VM -> trois couches virtuelles doivent s'exécuter pour permettre à votre application de fonctionner, si vous souhaitez une virtualisation de serveur OK mais si vous voulez simplement exécuter une application web ce n'est pas la meilleure solution. DOCKER -> Une seule couche entre votre vrai processeur et votre application web. Plus puissant et meilleure clonage / miroir si vous devez uniquement exécuter votre application web pour virtualiser ceux que je recommande
42 votes
N'oublions pas que Docker pour Mac et Docker pour Windows utilisent la couche de virtualisation.
6 votes
Cet article compare Docker-on-Windows avec Docker-on-Linux, donnant quelques informations utiles : collabnix.com/…
0 votes
Elasticité & Automatisation
2 votes
J'étais également confus quant à la raison pour laquelle les images Docker spécifient "FROM Ubuntu" si elles ne sont pas en cours d'exécution sur un système d'exploitation. J'ai écrit ce que j'ai appris : blog.andrewray.me/towards-a-strong-mental-model-of-docker
0 votes
Tout simplement dit, les machines virtuelles sont une virtualisation au niveau matériel alors que les conteneurs sont une virtualisation au niveau du système d'exploitation (noyau). Référez-vous à Hyperviseur.