Skip to content

Premier contact

Pour comprendre Docker, il convient d'en comprendre la structuration.

Illustration registry docker

Le registry

Un Docker Registry est un service permettant de stocker et de distribuer des images Docker. Il sert de dépôt centralisé où les utilisateurs peuvent pousser (uploader) et tirer (télécharger) des images Docker. Un exemple bien connu est Docker Hub, qui est un registre public maintenu par Docker, mais il est aussi possible d'héberger son propre registre privé à l'aide de l'image Docker registry.

Fonctionnalités du Docker Registry

  • Public ou privé : Les registres peuvent être publics, accessibles à tout le monde, ou privés pour des utilisateurs restreints.
  • Versionnage : Le Docker Registry permet de versionner les images Docker avec des tags. Cela permet aux utilisateurs de récupérer une version spécifique d'une image.
  • Distribution d'images : Il facilite la distribution des images sur différents environnements (local, cloud, serveurs de production, etc.).

Les images

Une image Docker est un package léger, autonome et exécutable qui contient tout ce dont une application a besoin pour fonctionner. Cela inclut le code source de l'application, les bibliothèques, les dépendances, les outils nécessaires et les fichiers de configuration.

Caractéristiques d'une Image Docker

  • Immuable : Une fois créée, une image Docker ne change pas, ce qui garantit que l'application fonctionne toujours de manière cohérente, quelle que soit la plateforme où elle est déployée.
  • Couches : Les images Docker sont constituées de plusieurs couches, chacune créée à partir des instructions définies dans un Dockerfile. Chaque couche représente une étape de la construction de l'image.
  • Portable : Une image Docker peut être exécutée sur n'importe quelle machine qui dispose de Docker, ce qui facilite la portabilité des applications entre différents environnements.

Mon premier run

Lancez votre premier container. L'image n'existant pas localement, elle va être téléchargée par le daemon Docker qui lui va lancer une instance de l'image appelée container.

sh
docker container run -it node:latest
  • docker est le binaire fourni par docker
  • container correspond à la ressource. Il en exite plusieurs courament utilisées (containers, images, volumes, networks) ainsi que d'autres telles que nodes, services, secrets ou configs qui existe dans un contexte swarm. Au cours de cette formation, nous n'étudierons pas swarm, l'industrie ayant penché en faveur de kubernetes.
  • run indique la commande exécutée par docker
  • it notifie que le container sera lancé de manière intéractive dans un pseudo-terminal
  • node représente le nom de l'image utilisée
  • latest précise la version de node à utiliser. S'il n'est pas indiqué c'est la latest qui sera prise en compte. C'est d'ailleurs un des principaux avantages de docker qui permet de basculer entre différentes versions d'une application, afin, pr exemple ; de s'assurer de la compatibilité d'un code donné avec différentes version d'un langage.

Au sein du container exécutez le code suivant :

js
[0, 1, 2, 3].forEach(number => console.log(number))

Vous venez de lancer votre premier container, qui vous a permis d'exécuter du code javascript au sein d'un REPL (Read Eval Print Loop).

Essayez maintenant de lancer un autre tag

sh
docker container run -it node:22-alpine3.19

Dans le cas présent on utilise la version 22-alpine3.19. Notez l'usage du -alpine qui n'a rien d'anodin. Les images sont généralement absées sur Ubuntu, Debian, Fedora...ou encore Alpine ! Cette dernière est une distribution orientée sécurité et ultra légère ; ce qui en fait une excellente base pour qui veut construire une imaghe personnalisée

Zoom sur l'architecture

Docker s'apuie sur un modèle client / serveur. Le binaire écrit en Go communique avec le daemon dockerd via une api rest.

Le processus dockerd gère les images, networks, volumes, etc et délègue le management des containers à containerd, brique centrale de l'architecture qui est produite et suivie par la Cloud Native Computing Foundation (CNCF).

L'api est exposée via la socket /var/run/docker.sock mais peut aussi être configurée pour écouter sur une socket TCP et donc être accessible via un client distant (ports 2375 et 2376). Docker client / server