Docker est une plateforme open source qui permet le lancement d’applications dans des conteneurs logiciels isolés. Ceux-ci permettent à vos applications d’être déployées facilement et uniformément. Aujourd’hui, on vous explique comment lancer votre conteneur en moins de cinq minutes. Spoiler : c’est moins compliqué qu’il n’y paraît.

Docker est une plateforme logicielle open-source qui vous aide à simplifier le processus de création, de gestion, d’exécution et de distribution de vos applications. Avec Docker, vous pouvez regrouper votre application et toutes ses dépendances dans un conteneur. Les conteneurs permettent à vos applications d’être déployées facilement et uniformément. 

Docker, c’est quoi ? Il s’agit d’une plateforme permettant de gérer (créer, déployer et exécuter) des conteneurs d’applications sur un système d’exploitation.

Un conteneur (container en anglais) c’est l’empaquetage de l’application.

À première vue, ça peut ressembler à des machines virtuelles mais il y a des différences :

  •  Avec la machine virtuelle on englobe le système d’exploitation, l’application et ses dépendances. Si l’on a 10 machines virtuelles on se retrouve avec 10 systèmes d’exploitations (Kernel) s’exécutant simultanément. Cela entraîne de facto une grande consommation de ressources (CPU/RAM).
  • Avec le système de conteneur on se passe de la partie système d’exploitation (le Kernel est ainsi mutualisé) et l’on va conteneuriser uniquement l’application et ses dépendances ce qui va alléger la taille des artefacts (containers) et les rendre plus exploitables.

Pour vous donner une image, la virtualisation c’est un peu avoir plusieurs navires porte-conteneurs (que l’on peut appeler noyau ou kernel en informatique) avec peu de  containers dessus alors que la conteneurisation est le fait de n’avoir qu’un seul navire porte-conteneurs (un seul kernel) sur lequel nous allons entasser les conteneurs.

Le logo de docker ci-après montre bien l’entassement des conteneurs sur une baleine (ici un kernel unique).

 

 

Afin de normaliser le fonctionnement des containers à travers les différentes plateformes, l’Open Container Initiative (OCI) est née. Ce projet à vu le jour en 2015 grâce à Docker et vise à mettre en place les standards de la conteneurisation, indépendamment de l’outil utilisé pour créer le conteneur que ce soit avec docker build, docker buildx, moby buildkit, google kaniko…

À noter : Docker est le logiciel le plus connu et le plus simple à utiliser pour builder des conteneurs.

Comment exploiter Docker en une poignée de minutes ?

Le fichier Dockerfile

Pour créer une image de notre application il faut définir un fichier de configuration qui s’appelle Dockerfile (sans extension de fichier). 

Il va contenir les instructions qui vont être exécutées lors du build afin de créer un conteneur. 

Voici le plan à exécuter pour créer le conteneur :

FROMimage de base

VOLUME [« dossier »] – Enregistre les fichiers temporaires dans le dossier tmp

COPY fichier-source fichier-destination – copier fichier source fichier destination

ENTRYPOINT [« commande », « arg1 », « arg2 », « arg3 »] – Exécuter une commande au démarrage du conteneur lancer notre app.jar avec la commande java -jar

EXPOSE port – le port sur lequel l’application va fonctionner

 

Exemple :

FROM openjdk:8-jdk-alpine

VOLUME [« /tmp »]

COPY target/dockerDemo-0.1.jar /app.jar

ENTRYPOINT [« java », « -jar », « /app.jar », « –spring.profiles.active=prod »]

EXPOSE 8080

Construire son image docker (build)

Une image Docker c’est une archive composée de layers, en gros une archive zip ou tar (en l’occurrence du tar) plus connue sur l’écosystème Linux. Cette image peut donc se retrouver sous la forme d’un fichier que vous pouvez transférer par mail ou tout autre moyen.

La méthode la plus connue et surtout la plus simple est d’utiliser le repository DockerHub (détaillé dans la section suivante).

Pour cela, utilisez la commande suivante afin d’exécuter les instructions du fichier Dockerfile :

docker build [OPTIONS] PATH | URL | –

          Construire avec PATH (le chemin ou se trouve le fichier Dockerfile)

           (.) représente le dossier courant:

          docker build . –t your-username/demo-app:1.0

           –tag , -t : Nom et éventuellement une balise au format ‘name:tag’

Comme toute bonne pratique dans l’informatique n’oubliez pas de nommer vos artefacts (ici via l’option de tag), sinon bon courage à vous pour les retrouver par la suite.

Comment l’image container est créée :

Vous vous demandez peut-être pourquoi nous avons copié JDK avant le code source. Les images Docker sont constituées de couches. Elles sont créées en fonction de la sortie générée à partir de chaque commande. Étant donné que le fichier JDK ne change pas souvent en tant que code source, nous ne voulons pas continuer à reconstruire JDK chaque fois que nous exécutons Docker build.

Copier les fichiers qui définissent vos dépendances d’applications et installez-les immédiatement vous permettra de profiter du cache Docker. Le principal avantage ici est un temps de construction plus rapide.

Repository docker (push & pull)

  • Push: 

Afin de publier une image vers le docker hub, nous allons utiliser la commande suivante :

docker push [OPTIONS] NAME[:TAG]

Exemple : docker push your-username/demo-app:1.0

Pour votre information, il faut bien évidemment être connecté à son compte docker hub afin de pusher un conteneur (docker login).

  • Pull:

Pour télécharger une image à partir de docker hub :

docker pull [OPTIONS] NAME[:TAG]

Exemple : docker pull your-username/demo-app:1.0

Remarque concernant la commande pull :

Si vous n’avez pas au préalable téléchargé l’image openjdk, lorsque vous allez exécuter l’instruction FROM openjdk:8-jdk-alpine, il va être téléchargé à partir de la librairie de docker hub en exécutant la commande suivante :

  • docker pull docker.io/library/openjdk:8-jdk-alpine

Démarrage du conteneur (run)

Afin de démarrer un conteneur nous utilisons la commande docker run permettant de lancer celui-ci à partir d’une image (un peu comme en POO entre une Class et un Object).

Le container lancé aura un processus (contenant un identifiant interne appelé PID pour processus identifié). 

Tant que ce processus est actif (PID) le conteneur est en état “running”, l’arrêt volontaire ou non (plantage/bug) va entraîner l’arrêt du conteneur lancé (vous pouvez en savoir plus en lançant la commande docker ps).

Si l’image n’existe pas localement elle sera d’abord téléchargée (pull).

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

Exemple :

  • docker run demo-app:1.0
  • docker run -d -p 8088:8080 demo-app:1.0

-d  detached mode exécuté l’application en arrière-plan (background), sans afficher le log de démarrage de l’application

-p 8088:8080: mapper le port 8088 local au port 8080 du conteneur afin d’utiliser le port 8088 pour lancer l’application (eg. http://localhost:8088). 

Petite astuce : afin de relancer un conteneur arrêté il vous suffit d’avoir recours à la commande docker start suivi de l’identifiant ou du nom du conteneur à redémarrer.

La plateforme Docker présente de nombreux avantages. Elle permet de construire, créer et déployer rapidement des conteneurs sur les machines (serveurs, desktop…) ayant Docker d’installé. 

Elle offre aussi un haut degré de portabilité par son respect du standard OCI, ce qui permet aux utilisateurs de construire et de partager des conteneurs sur une large variété de machines au sein d’environnements publics et privés.

Pour vous donner un exemple si une personne construit un conteneur avec Kaniko (un outil de Google permettant de builder un conteneur), ce même conteneur peut être indifféremment exécuté sur un cluster Kubernetes (EKS, AKS, Red Hat OpenShift), AWS ECS, Azure ACI ou tout autre orchestrateur de conteneurs compatibles OCI.

Il est donc facile de comprendre pourquoi le conteneur s’impose depuis 10 ans comme le standard incontournable sur le marché.

Partager
Faire suivre