Introduction à Docker [Partie 1]

Qu’est-ce qu’un « conteneur » ?

Le conteneur est une unité de déploiement universelle déplaçable sur n’importe quelle infrastructure.

Il est alors immédiat de faire l’analogie avec le conteneur de transport de marchandise qui va littéralement contenir des marchandises. C’est donc bien une unité de transport intermodale (et donc bien sûr scalable en fonction de la quantité de marchandise qu’il faudra transporter).

Exemple de conteurs de marchandises

Dans le cas de Docker, le conteneur va donc embarquer un applicatif et ses dépendances dans une unité de déploiement. Cela n’est pas sans rappeler le fonctionnement des machines virtuelles.

Machines virtuelles vs. conteneurs

L’engouement pour Docker rappelle l’époque de la virtualisation des machines, au début des années 2000 où le concept était novateur (l’idée d’avoir une machine dans une machine).

Dans le cadre de l’utilisation des machines virtuelles et de la virtualisation d’OS, ce sont toutes les applications et leurs ressources (Bins/Lib) qui sont embarqués dans un OS propre dit virtualisé.
Chaque VM (Virtual Machine pour machine virtuelle) possède son système d’exploitation dédié.

Différences entre machines virtuelles et containeurs

Dans le cas d’un conteneur, l’applicatif « croit » toujours qu’il est sur son OS dédié alors que ce n’est pas le cas réellement. En effet, contrairement à la virtualisation, chaque conteneur n’a pas besoin de recopier les binaires/librairies de l’OS mais celui-ci les partage avec d’autres conteneurs.

La mise en commun des ressources (librairies) permet d’alléger l’utilisation de RAM et d’espace disque que nécessiterait le même nombre de machine virtuelle.

Le moteur de gestion de conteneur (Container Engine) est directement placé devant l’OS et s’assure ensuite de la bonne gestion des conteneurs.

Quels usages ?

De multiples usages ! En effet, cette technologie est très efficace car déployable sur n’importe quel environnement (c’est ce qu’on appelle la portabilité).

Le fait d’encapsuler des unités d’environnement applicatif (l’application, ses dépendances et son environnement) permet à cette technologie d’avoir une utilisation très optimisée pour le développement de micro-services (découpage d’une application en services dédiés).

Docker

Docker a été créé en 2013 et est donc une technologie relativement récente. Cependant elle ne s’appuie pas véritablement sur des avancées récentes puisqu’il y avait auparavant des technologies se basant sur ce principe de conteneurs (comme la technologie Linux LXC sur laquelle Docker s’appuie).

Docker a donc fait la synthèse de ces outils pour proposer une solution de conteneurisation déployable clé en main.

Selon Wikipédia, une définition de Docker pourrait être :

Docker est un outil qui peut empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n’importe quel serveur.

Wikipédia

L’architecture de la solution est de type client/serveur :

  • Un client Docker
  • Un moteur Docker (le Docker Engine)
  • Une communication client/serveur grâce à des appels REST (peut-être sur la même machine ou bien une machine distante)
L’environnement Docker avec le client, l’hôte (dont le moteur) et le registry (ensemble de repositories).

L’utilisation de Docker se fait, sans surprise pour un outil provenant du monde Linux, via des lignes de commandes. Ces lignes de commandes permettront de manipuler l’ensemble de la solution Docker comme par exemple :

  • Décrire l’image d’une application
  • Publier l’image dans un repository (i.e. la bibliothèque contenant l’ensemble des images Docker que l’on souhaite gérer)
  • Interroger un repository
  • Gérer les versions des images dans le repository
  • Déploiement des images

A noter que l’instanciation de conteneurs Docker à la fois Linux et Windows, sur une même machine, n’est pas possible. Ce serait, à mon avis, un des seuls points faibles de cette technologie.

L’image Docker

L’image est le composant qui va être executé au sein d’un conteneur. C’est l’image qui va contenir la description de l’applicatif et de ses dépendances.

Le kernel supporte l’ensemble des couches. Chaque couche supplémentaire va ensuite s’ajouter et référencer son parent.

On trouve ensuite une première brique de base contenant notamment l’OS à embarquer (par exemple une distribution Debian).

A cette image de base, nous ajoutons ensuite une multitude de couches indépendantes permettant d’embarquer notre applicatif : les dépendances (exemple : emacs, Apache, etc).

Deux conteneurs Docker reposant sur le même noyau (Kernel).

Le conteneur, à proprement parler, n’apparaît qu’au sommet de ce mille-feuilles et permet ainsi de véritablement alléger le processus de déploiement d’un conteneur (puisque qu’il n’embarque pas directement toutes les couches qui le composent).

Repository

Le repository désigne la bibliothèque contenant l’ensemble des images Docker que l’on souhaite gérer. Au début de l’aventure Docker, il était uniquement possible d’accéder au repository Docker officiel Docker Hub.

Ce magasin répertorie l’ensemble des images Docker créées par les utilisateurs/organisations afin de les réutiliser dans nos projets. Il existe d’ailleurs un système de public index qui permet d’évaluer les images via un classement interne permettant d’avoir une confiance en l’image à utiliser.

Docker Hub offre également la possibilité de lier un dépôt Github à une image Docker. A chaque commit de la nouvelle version du code, un build et un packaging automatique sont réalisés via cet outil d’automated build. L’image est ainsi générée et poussée dans le repository publique de l’utilisateur.

Depuis, il est possible d’avoir son propre repository privé afin de gérer des images internes à notre organisation.

Le docker File

Le dockerfile est le fichier qui va permettre de décrire la liste des actions à effectuer afin de fabriquer notre image Docker. Cela ressemble beaucoup à un script classique avec des commandes spécifiques à Docker.

#This is a sample Image 
FROM ubuntu 
MAINTAINER demouser@gmail.com 

RUN apt-get update 
RUN apt-get install –y nginx 
CMD [“echo”,”Image created”]
  • FROM permet de charger le système d’exploitation désiré
  • RUN permet de spécifier ce que l’on va devoir effectuer pour installer l’image
  • CMD pour informer l’utilisateur que l’image est bien créée

Pour terminer, nous allons évoquer rapidement quelques outils propres à Docker qui seront d’une importance capitale lors de son utilisation en production.

Docker Compose

Cet outil permet de construire des applications multi-containeurs notamment pour de l’utilisation en micro-services (exemple : une application qui contiendrait un conteneur BDD, un conteneur front, etc).

Docker Compose se chargera de créer et lancer plusieurs conteneurs grâce à un fichier de configuration docker-compose.yml.

Cet outil permet donc de véritablement « composer » un ensemble de conteneurs à faire tourner sur une seule et même machine.

Docker Swarm

Comment orchestrer la création et le lancement de conteneurs sur non pas une seule et même machine mais plusieurs serveurs ?

C’est ce à quoi répond l’outil Docker Swarm permet de monter des clusters de machines d’exécution des containeurs. Il s’agit de l’orchestrateur officiel de Docker et fournit un système de scalabilité et haute_disponibilité des images Docker.

Il sera chargé de répartir les conteneurs sur plusieurs moteurs/serveurs. C’est en quelque sorte de l’orchestration de conteneur comme pourrait le faire un Kubernetes.

Conclusion

Nous venons de voir un aperçu de l’utilité de Docker et de ses fonctionnalités dans les très grandes lignes. Je ne prétend pas être un expert de cette technologie, bien au contraire. N’hésitez pas à commenter ce post et à me suggérer des améliorations, corrections.

Dans la seconde partie, nous rentrerons plus dans la pratique avec nos premiers essais Docker sous Windows.

Avatar

(8 Posts)

Né avec une souris dans la main, j'ai baigné depuis petit dans l'informatique. Docteur en physique de formation, je me suis formé tout au long de ma carrière de développeur pour répondre à des besoins toujours plus exigeants. Je me revendique Artisan Développeur ce qui retranscrit ma passion pour le code bien fait et façonné avec rigueur. Sinon je suis aussi un mari et papa comblé, joueur de guitare.

Leave a Reply

Your email address will not be published. Required fields are marked *