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 Dockerfile crée un layer; l’ordre impacte les performances.

  • ENTRYPOINT vs CMD:

    • ENTRYPOINT définit l’exécutable principal

    • CMD fournit 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 :

  1. Préparer les fichiers:

    • Un Dockerfile (voir plus haut) et un dossier ./site/ contenant un fichier “bonjour”.

  2. Démarrer l’environnement:

    • docker compose up -d --build

  3. Entrer dans un conteneur:

    • docker compose exec -it web bash

    • Dans le conteneur, connectez-vous à la base de données avec le mot de passe ‘example’:

    • psql db -U postgres

  4. Arrêter et nettoyer:

    • docker compose down (ajouter -v pour 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.20 et non alpine:latest).

  • Tirer parti de .dockerignore pour 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 Dockerfile est 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> et docker inspect <nom>

    • vérifier ENTRYPOINT/CMD, permissions, ports occupés.

  • Problèmes de réseau:

    • vérifier les réseaux, curl/ping entre 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.