Introduction à Docker

Docker est un outil open source écrit en GO qui permet de créer des conteneurs sur Linux, Windows, Mac OS.

Les promesses de Docker sont les suivantes:

  • Déploiement Rapide: le boot d’un contenaire est quasi-instantané contrairement
  • Portabilité: On peut déporter son conteneur sur une machine physique, virtualisée ou une instance sur le cloud
  • Orienté micro-services: Chaque service de l’application est indépendant, contrairement au schéma monothéique

Avant de faire un bon vers le monde futuriste qu’est le conteneurisation, petite revue d’histoire 😉

 

Bref retour sur la virtualisation

virtualisation

 

La virtualisation est née de la problèmatique suivante:

Comment exploiter au mieux les ressources de mes machines ?

Pour bien comprendre le concept, prenons l’exemple d’une application hébergée sur un serveur bare metal et qui consomme uniquement 30% de la capacité, en l’absence de virtualisation, c’est de la ressource non utilisée donc gaspillée.

La virtualisation permet de faire fonctionner plusieurs systèmes d’exploitations différents sur une même machine physique.

La couche software, qui est l’hyperviseur(Esxi, Hyper-V, KVM, Xen…) permet de créer autant de VM’s que la machine physique nous le permet. Ainsi nous mutualisons au maximum nos ressources.

Pour mon usage personnel, cela m’a permis il y a quelques années de tester plusieurs distributions linux sur un hyperviseur VMware tournant sur Windows.
L’usage de la virtualisation en entreprise, permet de mutualiser les ressources, et d’éviter la sur-consommation.

Du coup on réduit le nombre de serveurs, donc le coût en électricité et maintenance est réduit. La facture en fin d’année est réduite d’avantage.

 

Mais alors, qu’est-ce qu’un conteneur Docker?

container

 

Tout d’abord il faut savoir que Docker n’est pas nouveau, d’autres outils utilisaient déjà cette technologie tels que : OpenVZ, Solaris Zone, et LXC. Et d’autres sont également en forte progression tel que RKT, développée par la team coreOS.

Les premières versions de Docker utilisaient un driver LXC pour gérer ses conteneurs, depuis la société a développé et implémenté sa propre librairie: libcontainer

Un conteneur peut être vu comme une sorte de virtualisation, en effet on peut créer sa machine, s’y connecter, lancer des commandes, installer des paquets.

Cependant ce sont deux technologies qui ne sont pas comparables, et nous allons voir ensemble pourquoi.

La différence réside au niveau de la couche virtualisation, en effet Docker utilise et partage les ressources de l’OS hôte pour gérer ses conteneurs, tandis que la virtualisation « classique » se situe au niveau du hardware et offre une complète isolation avec le système hôte.

De plus, Docker est orienté application et ne nécessite pas d’émuler un OS complet avec toutes ses librairies et binaires pour pouvoir faire tourner une application.

Le résultat est que ce l’on se retrouve avec un conteneur beaucoup plus léger qu’une VM, comptez quelques mega octets contre quelques giga.

 

Cgroup & Namespaces

Il est important de comprendre le fonctionnement de Docker, sans celà on utilise un peu l’outil à l’aveugle en pensant que la magie existe vraiment.

Un conteneur utilise les fonctionnalités du Kernel qui sont: CGroups pour control groups et Namespaces

Cgroups permet de mesurer, découper et limiter les ressources totales utilisés par un groupe de processus qui tourne sur un OS.

Pour un container, Cgroups gèrera la répartition des ressources CPU, mémoire, I/O, et réseau.

Namespaces permet l’isolation, et fait en sorte que les processus ne voient pas les ressources utilisées par d’autres.

Il existe différents Namespaces:

IPC: Communication interprocessus

Mount: (mnt) Point de montage (sytème de fichiers)

Process: (PID) Permet au conteneur d’avoir sa propre liste de processus. independant au systeme hoste

Network: (NET) Permet au conteneur d’avoir ses interfaces reseaux

UTS: permet pour chaque contenaire d’avoir son propre hostname distinct de l’hote

User ID (User): Utilisateurs et groupes

 

Conclusion

Docker est un outil formidable pour mettre en place une stack de développement, de part sa portabilité et la facilité de déploiement des conteneurs.

Je n’ai eu que très peu de retour sur une stack complète Docker complète en production.

Dans mon prochain billet, nous allons aborder l’utilisation de docker, les dockerfile, les images ainsi que la notion de layers, dockerhub, docker-compose et d’autres aspects concernant Docker.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *