🖨️ Version PDF
Déjà abordé dans le cours et la présentation.
Dans cette page, vous allez pouvoir utiliser Docker en étant guidé pas à pas avec des exercices simples.
Analogie : Comme un conteneur de transport, il isole son contenu sans révéler son environnement externe.
Fonctionnement :
Avantages :
Compatibilité :
docker-cli
docker daemon
Lien vers la page d’installation de Docker Desktop / WSL 2
Lien vers la documentation de Docker
Dans votre terminal, vous pouvez voir la version de votre Docker :
Lancer le premier conteneur
docker container run hello-world
Résultat attendu :
Hello from Docker! This message shows that your installation appears to be working correctly.
Docker télécharge automatiquement l’image hello-world depuis Docker Hub (si elle n’est pas déjà locale). Le conteneur s’exécute, affiche un message, puis s’arrête !
Sur le site DockerHub, l’image HelloWorld
Lister les images locales
docker image ls
Colonnes importantes :
docker image pull ubuntu:latest
Ce que vous devez voir :
Lancer un conteneur Ubuntu en mode interactif
docker container run -it ubuntu:latest bash
Options :
J’ai ajouté un ls pour voir les répertoires de mon container Ubuntu actif.
Attention, il faudra ouvrir un autre terminal pour lister votre container actif, sinon, il n’y aura rien. Ensuite pour quitter votre Ubuntu, vous pourrez faire un exit !
exit
docker container ls
Quitter un conteneur (pour quitter votre Ubuntu comme je l’ai précisé plus haut):
Dans ce cas, le conteneur s’arrête automatiquement.
docker container ls --all
Sur cette copie d’écran vous voyez que la seconde commande permet d’afficher tous les containers y compris ceux qui ne sont pas actifs mais présents. J’ai encadré les noms (NAME) générés pour chaque image car on peut utiliser les ID ou les NAME.
docker container start <NOM_OU_ID>
Exemple :
docker container start practical_murdock
Piège : il faut remplacer practical_murdock par le NAME donné aléatoirement par Docker !
practical_murdock
NAME
docker container stop <NOM_OU_ID>
docker container rm <NOM_OU_ID>
Autre exemple en utilisant le NAMES :
-it
-d
--detach
--name <NOM>
--rm
-e "VAR=valeur"
Exemple avec options combinées :
docker container run -it --rm --name mon_ubuntu -e "MA_VAR=coucou" ubuntu:latest bash
Afficher les détails d’un conteneur :
docker container inspect <NOM_OU_ID>
Affiche un JSON avec toutes les informations (statut, réseau, etc.).
docker image inspect hello-world
Supprimer les images
Si vous souhaitez supprimer plusieurs images en même temps, vous pouvez écrire les ID d’image ou les noms d’image séparés par des espaces les uns derrière les autres.
docker rmi Image Image
docker container run <IMAGE>
docker container stop <NOM>
docker container rm <NOM>
docker image pull <IMAGE>
docker container inspect <NOM>
Remarque : Comme vous êtes sous Windows, vous pouvez aussi utiliser Docker Desktop pour visualiser les conteneurs et images via une interface graphique.
Ce TP s’effectue sous Windows avec Docker Desktop et WSL2 (Ubuntu) activé.
Votre application Spring Boot doit déjà être packagée en .jar (fichier exécutable). Dans IntelliJ, Eclipse, VSC ou Spring Initializr, créez un projet simple que vous nommez demo-docker.
Une fois le projet généré, compilez-le avec Maven ou Gradle :
mvn clean package -DskipTests
Cela devrait créer votre fichier .jar dans le dossier target/, vous devriez voir ceci :
target/demo-docker-0.0.1-SNAPSHOT.jar
Il n’y a pas d’extension pour ce fichier. Un Dockerfile, c’est un fichier texte qui décrit comment fabriquer une image Docker.
Il ne lance rien et il construit juste une image, c’est comme une recette de cuisine !
Dans le dossier racine du projet (au même niveau que pom.xml), créez un fichier nommé dockerfile :
dockerfile
nano dockerfile
Vous pouvez aussi utiliser un éditeur différent.
Dans votre fichier dockerFile, insérez les lignes ci-dessous :
# choisir une image Java (OpenJDK ou autre) FROM openjdk:17-jdk-slim # définir le répertoire de travail WORKDIR /app # copier le JAR dans le conteneur COPY target/demo-docker-0.0.1-SNAPSHOT.jar app.jar # exposer le port par défaut de Spring Boot (vous pouvez le modifier) EXPOSE 8080 # définir la commande de démarrage (pour nous c'est le app.jar) ENTRYPOINT ["java", "-jar", "app.jar"]
Quelques explications :
Depuis le terminal WSL ou PowerShell, placez-vous dans le dossier du projet et exécutez :
docker build -t springboot-demo:latest .
Si vous disposez d’un compte sur DockerHub, vous pouvez y déposer (on dit publier) votre image pour que d’autres la récupère ou tout simplement pour tester. On voit ceci un peu plus loin dans cette page… ;)
Exécutez le conteneur et redirigez le port :
docker run -p 8080:8080 -d springboot-demo:latest
Ensuite, vérifiez que tout fonctionne correctement :
docker ps
Testez sur votre navigateur à l’adresse : http://localhost:8080
Pour afficher les logs de l’application en cours :
docker logs <nom_du_conteneur>
par exemple : docker logs springboot-demo
docker logs springboot-demo
Pour arrêter votre conteneur : docker stop <nom_du_conteneur>
docker stop <nom_du_conteneur>
docker build -t nom_image .
docker run -p 8080:8080 nom_image
docker stop id_conteneur
docker rm id_conteneur
docker rmi nom_image
docker logs id_conteneur
Créer une archive .tar :
docker image save -o springboot-demo.tar springboot-demo
Recharger votre image :
docker image load -i springboot-demo.tar
Connectez-vous à votre compte DockerHub (en créer un si vous n’en avez pas encore)
docker login
Renommez l’image avec votre nom d’utilisateur :
docker tag springboot-demo:latest moncompte/springboot-demo:latest
Poussez votre image :
docker push moncompte/springboot-demo:latest
FROM
COPY
WORKDIR
EXPOSE
ENTRYPOINT
RUN
ENV
Docker supporte les syntaxes :
exec
shell
ENTRYPOINT ["commande", "arg1", "arg2"]
ENTRYPOINT ["java", "-jar", "app.jar"]
Docker lance :
java -jar app.jar
Raisons :
Autre exemple :
ENTRYPOINT ["python", "app.py"] CMD ["--port", "8080"]
Docker lance : python app.py --port 8080
python app.py --port 8080
Moins recommandée, mais utile dans certains cas.
ENTRYPOINT command arg1 arg2
ENTRYPOINT java -jar app.jar
sh -c "java -jar app.jar"
Inconvénients :
ENTRYPOINT python app.py CMD --port 8080
Docker lance : sh -c "python app.py"
sh -c "python app.py"
Ici, vous voyez que le CMD est ignoré ou mal interprété, donc attention !
CMD
Nous verrons comment ajouter un Docker Compose pour lancer à la fois :
Un fichier docker-compose.yml sert à lancer plusieurs conteneurs d’un coup, à les configurer, à les mettre en réseau.
docker-compose.yml
Il permet de préciser les éléments suivants :
Exemple basique :
version: "3.9" services: db: image: postgres:16-alpine environment: POSTGRES_DB: demo POSTGRES_USER: demo POSTGRES_PASSWORD: demo ports: - "5432:5432" app: image: registry.gitlab.com/projetspringboot/app:latest depends_on: - db ports: - "8080:8080"
Nous verrons que la commande docker-compose up permet d’exécuter les actions du fichier docker-compose.yml
docker-compose up
sudo
Personnellement, j’utilise Docker et Kubernetes selon les projets, mais même si Docker est le standard de la conteneurisation, il existe d’autres outils répondant à des besoins différents : sécurité, intégration Kubernetes, légèreté ou flexibilité. Certains disent que Docker n’est pas suffisamment sécurisé, ce qui est probable, mais il est simple d’utilisation.
Voici les principales alternatives sous forme de tableaux :
Pour résumé, Docker reste la référence pour l’apprentissage et la simplicité, Podman lui, est considéré comme plus sécurisé (on n’est pas Root), containerd est léger et utilisé par d’autres outils, CRI-O est idéal avec du Kubernetes pur, LXC/LXD est une approche système, proche de la virtualisation, runc/rkt propose des outils bas niveau destinés aux environnements experts.
Voilà, vous avez une vision des alternatives à Docker.
Auteur : Philippe Bouget