🐳Docker
Tout le longue de ce cours nous avons utilisé une combinaison de Docker, VSCode et un Container Ubuntu pour experimenter avec le shell Unix.
Mais qu'est-ce que c'est Docker, et comment s'en servir ?
Q'est-ce c'est Docker ?
Docker est un logiciel qui permet de lancer et arrêter des Containers dans notre système d'exploitation.
Un Container est un processus qui tourne dans un "bac à sable" (c'est à dire, isolé de tous les autres processus) sur une machine hôte.
Docker est une interface qui simplifie les principes de namespaces et cgroups -- des technologies qui existent dans Linux depuis un moment pour :
Isoler une processus
Isoler le système de fichiers
Isoler des réseaux (subnets)
Contrôler finement les accès aux différents fonctionnalités dans le noyau (kernel)
A priori, on peut créer et lancer des Containers sans Docker, mais Docker facilite pas mal la tâche !
Container vs Image
Un container, étant un processus unique et isolé, doit tourner quelque chose et agir sur un système de fichiers.
Nous créons des Containers à partir d'une Image, qui est une snapshot (ou "photo") d'un système de fichiers déjà configuré pour être indépendant ou isolé.
Par exemple, je peux créer une Image d'un système d'exploitation comme Ubuntu. Dans l'image, nous aurons la hiérarchie identique à une installation Ubuntu, à partir de la racine /
, et qui contient tous les fichiers, binaires, etc nécessaires pour tourner une distribution d'Ubuntu.
Quand on instancie une Image en Container (en gros, on crée un processus avec une Image déjà configuré) :
Le système des fichiers est monté et disponible au processus
Une commande dans ce système de fichiers est lancé. Cette commande n'aura accès qu'au système de fichiers de l'image.
Quelle commande ? A nous de préciser ! Ca pourrait être un interprète comme
bash
, ou ça peut être un autre logiciel commemysql
ounode
, oupython
.
Le Container existera tant que le son processus existe. Dès que le processus s'arrête, le Container d'arrête aussi.
Il est important de comprendre qu'un Container est un processus comme les autres sur la machine hôte. Toutes les opérations privilégiées passe par le noyau du système d'exploitation hôte :
Les opérations privilégiées (ou system calls) sont, par exemple :
Lire ou écrire un disque dur
Envoyer un message sur la carte réseau
Contrôler des processus
...
Un Container, même s'il est isolé, n'est donc pas une machine virtuelle ! Tous les containers qui tournent sur la même machine, partagent le même noyau, le même RAM, et la même réseau.
Docker vs une Machine Virtuelle
Une machine virtuelle est une vrai division des ressources d'un ordinateur. Quand on lance une machine virtuelle, on monte un système d'exploitation entier, qui tourne en parallèle de celui du système hôte. Cette exécution et partage est géré par un hypervisor.
Pour les machines virtuelles, on affecte :
La quantité de RAM à sa disposition
Une espace sur le disque (au besoin)
Le pourcentage de temps sur le CPU (ou quantité de CPUs à sa disposition).
Ces ressources, une fois allouées ne sont plus disponibles pour le système hôte, ni pour d'autres machines virtuelles.
Au contraire, avec Containerisation, tout est partagé.
Virtualisation | Containerisation |
---|---|
On peut tourner n'importe quelle système d'exploitation (Windows, Linux, MacOS) en tant que machine virtuelle | Seulement les versions de Linux compatibles peuvent tourner en Container, puisqu'ils partagent toutes le même noyau. Il faudrait que les system calls soient identiques entre eux |
Très sécurisé : les machines sont complètement isolés entre eux et la machine hôte | Moins sécurisé : les containers sont isolés entre eux, mais si on a accès à la machine hôte, on peut voir dans les containers |
Lourd en ressources : on est obligé de ceder une partie pour chaque OS | Léger en ressources : on les partage, et on n'est pas obligé de tourner un OS explicitement parce qu'on utilise celui de la machine hôte |
Pourquoi la Containerisation est aussi populaire ?
Si à la base, la virtualisation est avantageux par rapport aux Containers, pour les utiliser ? Plusieurs raisons :
Principalement la notion de combiner l'ensemble des dépendances d'un projet dans une seule unité. Par exemple, je créer une image avec Apache et PHP 5.0, et je déploie mon site sur cette base. Je peux lancer ce container sur n'importe quelle machine avec Docker, et être sur que seulement PHP 5.0 est utilisé (au lieu d'être embêté si le serveur à PHP 7.0 installé)
Il est simple et rapide de lancer un Container, alors qu'il est parfois longue est dur de lancer et configurer une machine virtuelle
Une Container utilise, en général, moins de ressources, donc je peux en créer plusieurs.
Docker sur Windows
Docker sur Windows, comme vous avez constaté, est un peu sensible parce qu'à la base le noyau de Windows n'est pas compatible avec les noyaux Linux.
Pour utiliser docker sur Windows, on est donc obligé d'installer WSL (le windows subsystem for Linux), qui permet de lancer, en machine virtuelle une instance de Linux.
Ensuite, quand on lance Docker Desktop sur windows, il va utiliser plutôt WSL pour tourner les Containers.
Dernière mise à jour