Rappels docker#
Avant de se lancer sur Kubernetes, prenons un moment ensemble pour revoir les notions de docker : parcourez rapidement le texte suivant, et notez, s’il y en a, les points sur lesquels vous n’êtes pas à l’aise ou avez des questionnements.
Notions#
Docker permet de créer des images et de les “exécuter” (lancer des conteneurs).
Les images créées par Docker respectent le format OCI.
Principaux concepts:
Registre Docker (ex: Docker Hub, GitLab Container Registry): dépôt d’images.
Dockerfile: fichier de recette pour construire une image.
Image: modèle immuable qui contient les dépendances + application.
Conteneur: instance en exécution d’une image.
Docker Compose: description de plusieurs services.
Service: définition d’un conteneur (image/build, ports, env, volumes…).
Volumes: persistance des données au-delà du cycle de vie des conteneurs.
Network: réseau virtuel pour la communication inter-services (DNS interne).
Image vs Conteneur:
Image = modèle immuable (read-only layers)
Conteneur = instance en exécution (layer RW au-dessus)
Couches (layers) et cache de build: chaque instruction
Dockerfilecrée un layer; l’ordre impacte les performances.ENTRYPOINTvsCMD:ENTRYPOINTdéfinit l’exécutable principalCMDfournit des arguments par défaut
.dockerignore: exclure les fichiers inutiles du contexte de build.Réseau:
bridge (par défaut), host, none, réseaux user-defined (isolation et DNS interne)
Volumes:
named volumes, bind mounts; persistance des données en dehors du cycle de vie des conteneurs.
Rappels de commandes utiles (cheatsheet)#
# Images
docker build -t monimage:1.0 .
docker images
docker rmi monimage:1.0
# Conteneurs
docker run -d --rm -p 8080:80 monimage:1.0
docker ps -a
docker logs -f web
docker exec -it web sh # ou bash selon l'image
# Volumes & réseaux
docker volume ls
docker volume create data01
docker network ls
docker network create --driver bridge mynet
# Nettoyage (attention)
docker system df
docker system prune -f # supprime objets non utilisés
# Registres
docker tag monimage:1.0 registry.local/monproj/monimage:1.0
docker push registry.local/monproj/monimage:1.0
Exemples#
Dockerfile minimal (ubuntu avec client postgres)#
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y postgresql-client && apt-get clean
CMD ["sleep", "infinity"]
docker-compose.yaml (web + db)#
L’exemple suivant n’est pas une application fonctionnelle (il n’y a pas de serveur réel), mais montre comment un docker compose est construit.
services:
web:
image: demo
build: .
ports:
- "8080:80"
volumes:
- ./site/:/usr/share/nginx/html:ro
depends_on:
- db
networks:
- appnet
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: example
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- appnet
volumes:
pgdata:
networks:
appnet:
Instructions (Compose)#
Pour vous assurer que tout marche sur votre machine :
Préparer les fichiers:
Un
Dockerfile(voir plus haut) et un dossier./site/contenant un fichier “bonjour”.
Démarrer l’environnement:
docker compose up -d --build
Entrer dans un conteneur:
docker compose exec -it web bashDans le conteneur, connectez-vous à la base de données avec le mot de passe ‘example’:
psql db -U postgres
Arrêter et nettoyer:
docker compose down(ajouter-vpour supprimer les volumes nommés)
Commandes Compose#
docker compose up -d
docker compose ps
docker compose logs
docker compose exec -it db bash
docker compose down
Bonnes pratiques#
Construire des images petites et spécifiques.
Utiliser des bases officielles et maintenues, fixer les versions (ex:
alpine:3.20et nonalpine:latest).Tirer parti de
.dockerignorepour réduire le contexte de build.Rendre les builds reproductibles (versions, verrouillage deps:
package-lock.json,requirements.txt).Externaliser la configuration via variables d’environnement ou fichiers montés (jamais dans l’image).
Journalisation sur stdout/stderr; pas de logs dans des fichiers du conteneur.
Check-list avant de pousser une image#
Le
Dockerfileest minimal, ordonné pour maximiser le cache.Les secrets ne sont pas embarqués dans l’image (variables d’environnement/volumes uniquement).
L’exécutable de démarrage est défini (via
ENTRYPOINT/CMD).Les versions des dépendances sont verrouillées.
Dépannage rapide#
Conteneur ne démarre pas:
docker logs <nom>etdocker inspect <nom>vérifier
ENTRYPOINT/CMD, permissions, ports occupés.
Problèmes de réseau:
vérifier les réseaux,
curl/pingentre services.docker network ls/docker network inspect <net>
Volumes/persistance:
docker volume ls/docker volume inspect <vol>vérifier chemins et droits côté hôte (bind) et conteneur.