L’arrivée des conteneurs a marqué une révolution dans le domaine du transport de marchandises dans les années 50. Ils ont permis de fluidifier les zones de chargement et de déchargement, réglant alors les problèmes d’engorgement qui étaient apparus avec l’émergence de la mondialisation.
C’est en voyant l’impact que les conteneurs ont eu dans le domaine du transport que Solomon Hykes, l’un des créateurs de Docker, a eu l’idée en 2010 de standardiser ce concept, déjà présent dans le monde de l’informatique. Conservant ce principe de boîte isolée mais facilement accessible, les conteneurs tels qu’on les connaît aujourd’hui sont apparus.
Dans cet article, nous allons découvrir à quoi sert Docker afin de pouvoir, dans un second article, aborder son implémentation en lignes de commande.
C’est parti !
Docker est une technologie de conteneurisation qui facilite la gestion de dépendances au sein d’un projet et ce, à tous les niveaux (développement et déploiement). Disponible sur Linux, Windows et Mac OS, le mécanisme de Docker se centre autour des conteneurs et de leur orchestration, et c’est en cela que la conteneurisation se différencie de la virtualisation.
Là où la virtualisation demande la mise en place d’une machine virtuelle par contexte d’exécution, faisant alors tourner plusieurs machines virtuelles sur un même OS, la conteneurisation, quant à elle, se contente d’exécuter des conteneurs, beaucoup plus légers en termes de poids (de l’ordre du Mo) et de performance : ils sont donc beaucoup plus scalables. Docker propose un outil d’orchestration de ces conteneurs, leur permettant d’exister mais aussi de communiquer entre eux et avec l’extérieur du système d’exploitation faisant tourner Docker.
Le paradigme de la conteneurisation vient également avec plusieurs règles dont la plus importante est de se limiter à une seule application par conteneur pour bénéficier au maximum de la puissance de Docker !
Les schémas suivants illustrent bien la différence entre les contextes d’applications dans le cadre de la virtualisation et dans celui de conteneurisation :
Virtualisation
Conteneurisation
Nous l’avons dit précédemment, Docker permet de gérer de manière simplifiée la dépendance ; mais au fond, y a-t-il un réel intérêt ? Honnêtement, oui !
Il nous est tous arrivé de passer plusieurs heures à essayer d’installer et de lancer un projet car beaucoup de facteurs problématiques peuvent entrer en jeu, tels que le système d’exploitation, la base de données, ou encore la version du langage de développement.
Avec Docker, au prix de l’écriture d’un docker-compose (sur lequel nous reviendrons plus tard) lors de la création et de la phase de développement du projet, une grande partie de ces problèmes devient un lointain souvenir qu’il sera bon de garder pour raconter aux prochaines générations ô combien la vieille époque était dure !
Il existe trois concepts clés dans Docker : les conteneurs, les images et les fichiers Docker (Dockerfile). Dans cette partie, nous découvrirons ces trois concepts.
Ces trois concepts forment la chaîne de déploiement de conteneurs et possèdent deux sens de lecture. Dans notre cas, nous allons partir du résultat final, les conteneurs, pour remonter jusqu’à leur origine, les Dockerfile, en passant par les images qui se trouvent entre les deux.
Un conteneur est donc un espace dans lequel une application tourne avec son propre environnement. Les applications qu’un conteneur peut faire tourner sont de tous types : site web, API, db, etc.
Chaque conteneur est une instance d’une image. Il possède son propre environnement d’exécution et donc ses propres répertoires. Nous verrons comment déployer un conteneur dans le second article.
La force des conteneurs Docker réside dans le grand panel de configurations qui nous est proposé. Nous pouvons ainsi changer le port d’un conteneur à l’intérieur du système Docker mais également les faire facilement communiquer entre eux.
Nous avons abordé les images lorsque nous avons parlé des conteneurs. Mais d’ailleurs, qu’est-ce qu’une image ?
Les images représentent le contexte que plusieurs conteneurs peuvent exécuter. Elles sont aux conteneurs ce que les classes sont aux objets en Programmation Orientée ObjetParadigme de programmation qui a pour point central la définition de briques logicielles appelées "Objet" et les relations entre ces objets. : un moule.
Par contexte, il faut entendre la disposition des dossiers, la disponibilité de certaines librairies, le bindage de certains ports en interne et en externe du conteneur mais également un ensemble de commandes à exécuter au lancement d’un conteneur.
Tout comme les conteneurs, nous regarderons les différentes manières d’obtenir des images dans le second article.
Et voici la troisième et dernière pièce du puzzle : le Dockerfile.
Un Dockerfile est un fichier qui liste les instructions à exécuter pour build une image. Il est lu de haut en bas au cours du processus de build.
Voici un exemple visuel de ce à quoi un Dockerfile peut ressembler :
On y retrouve cette idée de contexte dont on a parlé avec les images : déplacement dans un dossier, exposition de ports et exécution d’une commande au lancement du conteneur.
Une image vaut mille mots, voici donc une illustration qui montre les différentes étapes de création d’un conteneur :
Le Dockerfile permet de créer une image. Cette image contient la liste des instructions qu’un conteneur devra exécuter lorsqu’il sera créé à partir de cette même image.
Docker a des avantages certes, mais il a aussi son lot d’inconvénients.
On peut, par exemple, citer les problèmes de sécurité induits par le fait que tous les conteneurs, même isolés, tournent sur le même OS. De ce fait, si un conteneur est infecté d’une manière ou d’une autre par un virus, il peut propager le virus à l’OS qui fait tourner Docker et par conséquent faire tomber toute l’infrastructure. C’est un problème qu’on ne retrouve pas dans le cadre de la virtualisation où les VM possèdent chacune un OS isolé.
Il devient également très difficile de gérer un Docker lorsque le nombre de conteneurs utilisés devient grand. Pour permettre une gestion plus simplifiée des conteneurs, plusieurs applications peuvent être utilisées parmi lesquels Kubernetes (n’hésitez pas à aller voir notre article à ce sujet).
Les conteneurs tournent sur un même OS, limitant ainsi les librairies utilisables à celles dont cet OS dispose et donc cassant l’aspect portabilité de Docker, contrairement à la virtualisation où chaque VM a son propre OS et donc rend disponibles ses librairies aux applications associées.
Pour terminer, il est très difficile de persister des données au sein de Docker. En effet, lorsqu’un conteneur est supprimé, l’ensemble de son contexte, et par extension ses répertoires, sont supprimés. Il existe deux méthodes qui permettent d’accéder à un répertoire extérieur à conteneur et d’y réaliser des opérations mais elles s’avèrent insuffisantes car difficiles et lourdes à mettre en place.
Vous l’aurez compris, la virtualisation propose parfois de meilleures solutions que la conteneurisation face à certaines problématiques. Il faut ainsi voir Docker comme un moyen de déployer rapidement des applications qui auront pour but d’évoluer dans le temps.
L’erreur à ne pas commettre serait de n’utiliser que la virtualisation ou la conteneurisation car on perdrait les avantages que proposent chacune des deux technologies. Vous pouvez donc sans souci profiter des avantages de la conteneurisation et de la virtualisation en les utilisant ensemble au sein d’un même projet.
Dans un second article, nous allons entrer dans l’aspect technique et déployer notre premier conteneur Docker, ainsi que voir comment obtenir des images et créer nos Dockerfiles. Nous allons également parler de docker-compose, un outil très puissant. Alors à très vite pour ce second article ! :)
On vous explique différentes méthodes pour optimiser vos images Docker : temps de build, taille de l'image et bonnes pratiques pour éviter les effets de bords.
Pourquoi choisir Symfony pour un projet de développement web ? Avantages et fonctionnalités incontournables du framework.
Qu’est-ce qu’un agent de message ou message broker ? À quoi ça sert ? Quels outils : plutôt Apache Kafka ou Rabbit MQ ? Le point avec des exemples sur cet article !