À l'origine, Docker utilisait Conteneurs LinuX (LXC), mais est ensuite passé à runC (anciennement connu sous le nom de libcontainer ), qui fonctionne dans le même système d'exploitation que son hôte. Cela lui permet de partager une grande partie des ressources du système d'exploitation de l'hôte. En outre, il utilise un système de fichiers en couches ( AuFS ) et gère la mise en 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 pourrait avoir les parties communes du système d'exploitation en lecture seule (et partagées entre tous vos conteneurs) et donner à chaque conteneur son propre montage pour l'écriture.
Ainsi, disons que vous disposez d'une image de conteneur de 1 Go ; si vous souhaitez utiliser une VM complète, vous devrez disposer de 1 Go x le nombre de VM souhaité. Avec Docker et AuFS, vous pouvez partager la majeure partie des 1 Go entre tous les conteneurs et si vous avez 1 000 conteneurs, il se peut que vous n'ayez qu'un peu plus de 1 Go d'espace pour le système d'exploitation des conteneurs (en supposant qu'ils utilisent tous la même image de système d'exploitation).
Un système entièrement virtualisé se voit allouer son propre ensemble de ressources et le partage est minimal. L'isolation est plus grande, mais le système est beaucoup plus lourd (il nécessite plus de ressources). Avec Docker, l'isolation est moindre, mais les conteneurs sont légers (ils nécessitent moins de ressources). Vous pouvez donc facilement faire tourner des milliers de conteneurs sur un hôte, sans qu'il ne bronche. Essayez de faire cela avec Xen, et à moins que vous n'ayez un très gros hôte, je ne pense pas que ce soit possible.
Le démarrage d'un système entièrement virtualisé prend généralement plusieurs minutes, alors que les conteneurs Docker/LXC/runC prennent quelques secondes, voire moins d'une seconde.
Il y a des avantages et des inconvénients pour chaque type de système virtualisé. Si vous souhaitez une isolation totale avec des ressources garanties, une VM complète est la solution. Si vous souhaitez simplement isoler les processus les uns des autres et en exécuter une tonne sur un hôte de taille raisonnable, Docker/LXC/runC semble être la solution.
Pour plus d'informations, consultez le site cette série d'articles de blog qui expliquent bien le fonctionnement de LXC.
Pourquoi est-il plus facile de déployer un logiciel sur une image Docker (si c'est le bon terme) que de le déployer simplement sur 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 y Marionnette Il y a toujours des mises à jour du système d'exploitation et d'autres choses qui changent entre les hôtes et les environnements.
Docker vous donne la possibilité d'instantaner le système d'exploitation dans une image partagée, et facilite le déploiement sur d'autres hôtes Docker. Localement, dev, qa, prod, etc. : tous ont la même image. Bien sûr, vous pouvez faire cela avec d'autres outils, mais pas aussi facilement ni aussi 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 que chaque test a besoin d'une copie vierge 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 du code personnalisé, soit avec des outils tels que Voie de migration - Cela peut prendre beaucoup de temps et signifie que les tests doivent être exécutés en série. Cependant, avec Docker, vous pouvez 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 puisque vous savez qu'ils seront tous exécutés sur le même instantané de la base de données. Puisque les tests sont exécutés en parallèle et dans des conteneurs Docker, ils peuvent être exécutés sur la même machine en même temps et devraient se terminer beaucoup plus rapidement. Essayez de faire cela avec une VM complète.
Des commentaires...
Intéressant ! Je suppose que je suis toujours confus par la notion de "snapshot[ting] du système d'exploitation". Comment fait-on cela sans, eh bien, faire une image du système d'exploitation ?
Eh bien, voyons si je peux expliquer. Vous commencez avec une image de base, puis vous apportez vos modifications, et vous les validez en utilisant Docker, et cela crée une image. Cette image ne contient que les différences par rapport à la base. Lorsque vous souhaitez exécuter votre image, vous avez également besoin de l'image de base. L'image est alors superposée à l'image de base à l'aide d'un système de fichiers en couches : comme mentionné ci-dessus, Docker utilise AuFS. AuFS fusionne les différentes couches et vous obtenez ce que vous voulez ; il vous suffit de l'exécuter. Vous pouvez continuer à ajouter de plus en plus d'images (couches) et il continuera à ne sauvegarder que les différences. Étant donné que Docker se construit généralement à partir d'images prêtes à l'emploi provenant d'un serveur de registre vous devez rarement faire un "snapshot" de l'ensemble du système d'exploitation vous-même.
16 votes
Analyse des performances de Docker et de KVM : bodenr.blogspot.com/2014/05/
1 votes
Si vous cherchez 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 la configuration.
0 votes
Vous trouverez des informations intéressantes sur la mise en œuvre et l'isolation des conteneurs à l'adresse suivante doger.io .
6 votes
En termes simples : VM -> trois couches virtuelles doivent fonctionner pour permettre à votre application de fonctionner, si vous voulez une virtualisation de serveur OK mais si vous voulez seulement exécuter une application web n'est pas la meilleure solution. DOCKER -> Une seule couche entre votre processeur réel et votre application web. Plus puissant et meilleur clonage/mirroring si vous devez seulement exécuter votre application web pour la virtualisation, je le recommande.
42 votes
N'oublions pas que Docker pour Mac et Docker pour Windows utilisent effectivement la couche de virtualisation.
6 votes
Cet article compare Docker-sur-Windows et Docker-sur-Linux, en donnant quelques indications utiles : collabnix.com/
0 votes
Elasticité et automatisation
2 votes
Je ne comprenais pas non plus pourquoi les images Docker spécifiaient "FROM Ubuntu" si elles n'exécutaient pas de système d'exploitation. J'ai noté ce que j'ai appris : blog.andrewray.me/towards-a-strong-mental-model-of-docker
0 votes
Pour faire simple, les machines virtuelles sont une virtualisation au niveau du matériel, tandis que les conteneurs sont une virtualisation au niveau du système d'exploitation (noyau). Voir Hyperviseur .