\newpage Composition de Docker --------------------- Docker est un écosystème d'outils de haut niveau, permettant d'utiliser des *conteneurs*. Docker est composé d'un daemon lancé au démarrage de votre machine, avec lequel vous interagissez via un client (le programme `docker`). La communication entre le daemon et le client s'effectuant sur une API REST généralement au travers d'une socket. Le client peut d'ailleurs ne pas être sur la même machine qui exécutera effectivement les conteneurs.[^dockermachine] C'est ce qu'il se passe lorsqu'on utilise *Docker4Windows* ou *Docker4Mac* : une machine virtuelle Linux est lancée parallèlement au système de base et chaque commande `docker` tapée est passée au deamon dans la machine virtuelle. [^dockermachine]: Il suffit de modifier la variable d'environnement `DOCKER_HOST` ou de passer le paramètre `-H` suivi de l'URL de la socket à `docker`. Voir aussi : Commençons par planter le décor, en détaillant les principaux mécanismes de Docker. ### Les images Docker Une image Docker est un système de fichiers en lecture seule. Elle est formée d'un ensemble de couches, agrégées selon le principe d'UnionFS. Une image peut, par exemple, contenir : * un système Ubuntu opérationnel, * le programme `busybox`, * un serveur web et votre application web, prêts à l'emploi, * ... Les images sont utilisées comme **modèle** qui sera ensuite dupliqué à chaque fois que l'on démarrera un nouveau conteneur. Il y a deux méthodes pour obtenir des images Docker : soit les construire avec les outils fournis, soit les récupérer depuis un registre. ### Les registres Docker (*Docker registries*) Les registres sont des plates-formes de stockage, publiques ou privées, contenant des images. Ils permettent de récupérer des images, mais également d'en envoyer. Le registre utilisé de base est le [Docker Hub](https://hub.docker.com/) : il contient à la fois des images officielles (ubuntu, debian, nginx, ...), des images créées par des utilisateurs, mais aussi des images de grands éditeurs, payantes, à destination des entreprises. Des registres alternatifs existent comme celui de [quay.io](https://quay.io/search), et les dépôts de sources tels que [GitHub](https://github.blog/2020-09-01-introducing-github-container-registry/) et [GitLab](https://docs.gitlab.com/ee/user/packages/container_registry/) le proposent également. ### Les conteneurs Docker Alors que les images constituent la partie immuable de Docker, les conteneurs sont sa partie vivante. Chaque conteneur est créé à partir d'une image : à chaque fois que nous lançons un conteneur, une couche lecture/écriture est ajoutée au dessus de l'image. Cette couche est propre au conteneur et temporaire : l'image n'est pas modifiée par l'exécution d'un conteneur. ![Couches d'un conteneur](layers-multi-container.png "Couches d'un conteneur"){ width=70% } Chaque conteneur s'exécute dans un environnement restreint et distinct de l'environnement principal (où vous avez votre bureau). Par exemple, dans cet environnement, vous ne pouvez pas voir les processus qui sont situés en dehors, ni accéder aux fichiers extérieurs.