Quelle est la différence entre Docker et une machine virtuelle (VM)?
Les conteneurs Docker fournissent un service similaire aux machines virtuelles, fournissant un environnement isolé pour l'exécution des applications, mais ce sont fondamentalement deux technologies différentes. Nous discuterons des différences et de ce qui rend Docker si utile.
Qu'est-ce qui rend Docker si utile?
L'objectif principal d'une machine virtuelle est de partitionner un grand serveur en petits morceaux. L'important est qu'il isole les processus en cours d'exécution sur chaque machine virtuelle. Par exemple, votre fournisseur d'hébergement pourrait avoir une machine à 32 cœurs et la diviser en huit machines virtuelles à 4 cœurs qu'il vend à différents clients. Cela réduit les coûts pour tout le monde, et ils sont parfaits si vous exécutez de nombreux processus ou si vous avez besoin d'un accès SSH complet au matériel sous-jacent.
Cependant, si vous n'exécutez qu'une seule application, vous utilisez peut-être plus de ressources que nécessaire. Pour exécuter cette application unique, l'hyperviseur doit faire tourner tout un système d'exploitation invité, ce qui signifie que la machine à 32 cœurs exécute huit copies d'Ubuntu. En plus de cela, vous avez une surcharge de machine virtuelle pour chaque instance.
Docker présente une meilleure solution. Les conteneurs Docker offrent une isolation sans la surcharge des machines virtuelles. Chaque conteneur fonctionne dans son propre environnement, séparé avec des espaces de noms Linux, mais la partie importante est que le code dans les conteneurs s'exécute directement sur la machine. Aucune émulation ou virtualisation n'est impliquée.
Il y a encore un peu de surcharge en raison de la mise en réseau et de l'interfaçage avec le système hôte, mais les applications de Docker fonctionnent généralement à des vitesses proches de la vitesse sans système d'exploitation, et certainement beaucoup plus rapides que votre VPS moyen. Vous n'êtes pas obligé d'exécuter 8 copies d'Ubuntu, une seule, ce qui rend peu coûteux l'exécution de plusieurs conteneurs Docker sur un hôte. Des services comme Elastic Container Service d'AWS et Cloud Run de GCP offrent des moyens d'exécuter des conteneurs individuels sans provisionner un serveur sous-jacent.
Les conteneurs regroupent toutes les dépendances dont votre application a besoin pour s'exécuter, y compris les bibliothèques et les binaires utilisés par le système d'exploitation. Vous pouvez exécuter un conteneur CentOS sur un serveur Ubuntu; ils utilisent tous les deux le noyau Linux, et la seule différence réside dans les binaires et bibliothèques inclus pour le système d'exploitation.
La principale différence avec les conteneurs Docker est que vous n'aurez généralement pas d'accès SSH au conteneur. Cependant, vous n'en avez pas exactement besoin: la configuration est entièrement gérée par le fichier conteneur lui-même, et si vous souhaitez effectuer des mises à jour, vous devrez pousser une nouvelle version du conteneur.
Étant donné que cette configuration se déroule entièrement dans le code, elle vous permet d'utiliser le contrôle de version comme Git pour votre logiciel serveur. Étant donné que votre conteneur est une seule image, il est facile de suivre les différentes versions de votre conteneur. Avec Docker, votre environnement de développement sera exactement le même que votre environnement de production, et également le même que l’environnement de développement de tous les autres, ce qui atténuera le problème de «il est cassé sur ma machine!»
Si vous souhaitez ajouter un autre serveur à votre cluster, vous n’avez pas à vous soucier de la reconfiguration de ce serveur et de la réinstallation de toutes les dépendances dont vous avez besoin. Une fois que vous avez créé un conteneur, vous pouvez facilement lancer une centaine d'instances de ce conteneur, sans trop de configuration. Cela permet également une mise à l'échelle automatique très simple, ce qui peut vous faire économiser beaucoup d'argent.
Inconvénients de Docker
Bien entendu, Docker ne remplace pas de sitôt les machines virtuelles. Ce sont deux technologies différentes, et les machines virtuelles ont encore de nombreux avantages.
Le réseautage est généralement plus impliqué. Sur une machine virtuelle, vous disposez généralement d'un matériel réseau dédié qui vous est directement exposé. Vous pouvez facilement configurer des pare-feu, configurer les applications pour qu'elles écoutent sur certains ports et exécuter des charges de travail complexes comme l'équilibrage de charge avec HAProxy. Sur Docker, car tous les conteneurs fonctionnent sur le même hôte, c'est souvent un peu plus compliqué. Cependant, les services spécifiques aux conteneurs tels que Elastic Container Service d'AWS et Cloud Run de GCP fourniront généralement ce réseau dans le cadre de leur service.
Les performances sur les systèmes d'exploitation non natifs sont toujours comparables à celles des machines virtuelles. Vous ne pouvez pas exécuter un conteneur Linux sur une machine hôte Windows, c'est pourquoi Docker pour Windows utilise en fait un sous-système Windows pour machine virtuelle Linux pour gérer les conteneurs en cours d'exécution. Docker fournit essentiellement une couche d'abstraction au-dessus de la machine virtuelle dans ce cas.
Les données persistantes sont également un peu compliquées. Les conteneurs Docker sont conçus pour être sans état. Cela peut être résolu avec des montages de volume, qui montent un répertoire sur l'hôte sur le conteneur, et des services comme ECS vous permettent de monter des volumes partagés. Cependant, cela ne vaut pas la peine de stocker des données sur un serveur normal et vous ne voudriez pas vraiment essayer d'exécuter une base de données de production dans Docker.