Introduction
Présentation de Docker
Docker, lancé pour la première fois en 2013, est un logiciel libre et gratuit (dans sa version community) permettant de gérer des applications de façon autonome. L’application est embarquée dans un environnement indépendant appelé conteneur. Cet environnement contient le code de l’application ainsi que les éléments nécessaires à son exécution (constituant le runtime).
Peu après son lancement, Docker s’est fortement démocratisé dans les entreprises, car il facilite le déploiement rapide d’une application de façon indépendante. Dans le contexte DevOps actuel qui tend non seulement à réduire le temps entre la production et la livraison, mais aussi à augmenter le nombre des cycles de livraison, Docker a su s’imposer pour simplifier les aspects de déploiement et de gestion de l’exploitation en production.
La tendance vers l’augmentation de la virtualisation des environnements s’est accentuée ces dernières années. Les aspects critiques de cette approche, notamment en termes de performance et de disponibilités de ressources, ont commencé à montrer leurs limites. C’est là qu’un franco-américain, Salomon Hykes, a eu la bonne idée de créer dotCloud, qui évoluera...
Concept de conteneurs
Il faut considérer un conteneur comme un processus autonome qui possède tout ce dont il a besoin pour faire tourner une application comme une petite machine virtuelle, totalement indépendante et isolée du système hôte. Mais quels avantages cela apporte-t-il ?
1. Avantages pour l’infrastructure
Prenons un exemple pour illustrer nos propos. Imaginons que l’on souhaite utiliser la base de données documentaire MongoDB. Plusieurs choix sont disponibles pour répondre à ce besoin, dont parmi eux :
-
Installer le moteur de la base de données sur notre système pour l’utiliser directement.
-
Déployer une instance de la base de données sur un serveur (distant ou local).
-
Louer une instance chez un fournisseur de service en mode PaaS (Platform as a Service).
-
Exécuter une instance de la base de données dans une machine virtuelle
Chacune de ces solutions présente des avantages spécifiques et toutes fonctionnent. Cependant, il existe une solution encore plus simple (et souvent moins onéreuse) que celles énoncées précédemment : utiliser la base de données dans sa forme conteneurisée. On va alors s’approprier tous les éléments nécessaires pour que le conteneur puisse fonctionner sur une instance de Docker. Grâce à ceci, non seulement on évite à notre système hôte d’être modifié, mais on s’ouvre aussi plusieurs portes en termes de performance et de flexibilité.
Même si cet exemple se prête bien à l’illustration du concept, il est important de ne pas considérer que la totalité des applications existe en forme conteneurisée. En effet, des applications avec une dépendance à une interface graphique lourde (desktop) ou des applications présentant des dépendances particulières vis-à-vis du matériel ne peuvent être que difficilement conteneurisées.
a. Absence de modification du système
Comme cela a été dit, un des avantages de cette pratique est que le système actuel n’est pas modifié. Qu’est-ce que cela signifie ? Généralement, l’installation d’une application va altérer certaines parties d’une installation. Par exemple, sous Windows, il est très courant que les applications créent une ou plusieurs clés de registre et il arrive tout aussi fréquemment qu’elles en laissent une partie à la suite de leur désinstallation.
De la même manière, lors d’une installation, des fichiers seront copiés un peu partout sur le disque dur, et il arrive qu’ils restent sur celui-ci après une désinstallation. Finalement, il est très commun qu’un service soit créé ; si on reprend le cas de MongoDB, il faut bien qu’un service soit créé et lancé localement pour que la base soit opérationnelle et réponde aux requêtes.
Ce service peut parfois être configuré pour démarrer avec le système, ouvrir des ports dans le pare-feu ou, encore pire, peut entrer en conflit sur des réservations particulières avec d’autres processus.
Bref, un ensemble de modifications interviennent lorsqu’on installe un produit sur un système, et ceci est souvent non désiré.
Un exemple assez connu de problème qui arrive sur ce type d’installation est un conflit entre WampServer (serveur de développement PHP) et Skype, car tous les deux veulent utiliser le port 80. Il faut généralement aller dans les options avancées de Skype pour lui demander de ne pas utiliser le port 80 en cas de problèmes d’accès. Ce genre de souci peut être très chronophage dans sa résolution, notamment si c’est la première fois que cela arrive.
Docker offre l’avantage d’isoler totalement les conteneurs du système (à l’instar d’une machine virtuelle). Toutes les opérations effectuées dans un conteneur restent dans celui-ci et partiront avec lui lors de sa suppression. En l’absence de configuration spécifique, le seul reliquat qui restera présent sur le système est le fichier image qui a été à l’origine de la création du conteneur, au cas où un autre conteneur doive être recréé avec.
b. Performances accrues
Au-delà du fait de préserver un système non modifié, Docker apporte également un avantage en termes de performance. Avec l’équivalent technologique consistant à créer une machine virtuelle pour y installer le produit, il existe une contrainte de réservation de ressources. En effet, une machine virtuelle, dès qu’elle est lancée, bloque les ressources qui lui sont allouées et cela même si elle ne les utilise pas. Certains hyperviseurs comme Hyper-V ont la possibilité de définir des ressources dynamiques (comme la RAM par exemple) avec un seuil minimum et un seuil maximum, mais ça n’empêche pas qu’une partie des ressources est bloquée, peut-être inutilement.
De la même façon, lorsqu’on utilise une machine virtuelle, la première étape consiste à installer un système d’exploitation. Le système hôte va donner accès à certaines ressources au système invité de l’instance, mais ce dernier est totalement autonome, c’est d’ailleurs pour ça que l’on peut installer des instances de Windows sous Linux et vice-versa. Il s’agit d’une émulation totale d’un environnement.
Là où Docker se différencie, c’est qu’il va s’appuyer sur les API du système hôte pour faire son travail au lieu de nécessiter l’installation d’un système...
Conclusion
Ce chapitre a balayé rapidement l’historique de Docker et la raison pour laquelle il s’est rapidement imposé dans le monde d’exploitation logicielle, et également pourquoi il est pertinent de l’utiliser en tant que développeur. Lorsque vous aurez intégré Docker dans votre cycle de développement, tant sur l’aspect provision de service que sur l’aspect déploiement et tests, vous verrez que vous gagnerez en rapidité et qualité de production.
Étant donné que pour les développeurs les ressources machines sont souvent critiques, Docker offre un moyen parfait pour leur éviter de se retrouver à court de RAM ou de CPU, laissant ces ressources disponibles pour leur EDI favori, tout en permettant de tester rapidement leur création dans un environnement autonome et isolé.
Finalement, lorsque l’on se trouve dans un cycle de développement, une des composantes essentielles à la productivité est l’existence d’un feedback immédiat. Dans certains cas, Docker offre ce retour rapide d’information. Et cela sans quitter son EDI, comme on le verra au fil de cet ouvrage.