Docker compose

Même si la commande docker est très puissant, il y a beaucoup de commandes à retenir.

Autant créer un fichier de configuration, qui précise l'image à utiliser, le volumes à monter etc.

Ce fichier s'appelle docker-compose.yml et il est en format yaml:

Créez, dans le même répertoire que votre fichier app.js, un fichier qui s'appelle docker-compose.yml :

version: '3.9'

services:
  my-node-app:
    image: node:18
    working_dir: /app
    volumes:
      - ./:/app
    command: node app.js

Ensuite on peut lancer notre service avec :

docker compose run my-node-app

Cette fois si, la configuration du Container y compris l'image à utiliser, les volumes à monter et la commande à exécuter, est lu du fichier.

Il est possible de préciser plusieurs services dans le même fichier docker-compose.yml et les lancer indépendamment. Docker créera un Container pour chaque service.

La plupart du temps, on aimerait lancer un service qui agit comme serveur, c'est à dire, il attend des messages réseau (et non pas des éntrées claviers). Par exemple :

  • Un serveur SQL (base de données)

  • Un API

  • Un site en PHP qui est servi par Apache

  • ...

On peut préciser l'ensemble dans un docker-compose.yml, puis contrôler le tout avec :

Notre projet VSCode

Regardez dans le fichier .devcontainer/docker-compose.yml du projet du cours :

Dans la première version de ce fichier, j'avais construit mon Container en local, c'est à dire, j'ai précisé un Dockerfile (qui existe dans le même dossier), qui contient toutes les instructions pour construire mon Container. Les lignes commentées (build), permet de construire automatiquement l'image à partir du Dockerfile au lancement de docker compose.

Un fois stable, j'ai plutôt déployé mon image dans un dépôt docker privée (Container Registry). Ceci peut être sur Docker Hub (on peut avoir un compte gratuit, mais il est limité en nombre d'utilisateurs). Mon fournisseur Cloud, Scaleway, propose aussi l'option de Container Registry. J'ai donc construit et déploy mon Image avec les instructions suivantes :

J'ai ensuite remplacé les lignes build par image, en précisant l'identifiant de l'image.

En fait, quand on utilise Reopen in Container, Docker fait le suivant :

  • L'image est récupérée du Container Registry

  • Un Container est lancé, avec la command bash qui reste continuellement ouvert grâce à une boucle infinie

  • On monte le dossier parent de .devcontainer à l'emplacement /home/hetic dans le Container

  • Après VSCode établit une connexion avec ce Container, qui nous permet d'ouvrir un Terminal comme si on était dans Ubuntu.

Regardez le fichier Dockerfile. Il s'agit d'une liste d'instructions qui explique comment créer une image personnalisée.

En ce concerne le Dockerfile, on n'est pas sensé tout comprendre pour le moment, mais on peut déjà dire que notre base de départ est l'image ubuntu:22.04 :

Mises à jour des images

Si jamais une Image se met à jour dans le dépôt on peut facilement la récupérer :

Mis à jour