Docker simplement expliqué

01 Le problème que Docker résout

Avant Docker, déployer une application sur un nouveau serveur relevait du parcours du combattant.

Vous avez développé votre application sur votre machine, elle fonctionne parfaitement. Vous la déployez sur le serveur de production et… rien ne fonctionne. Versions de bibliothèques différentes, dépendances manquantes, variables d’environnement absentes. C’est le fameux syndrome « ça marche chez moi ».

AVANT DOCKER Machine Dev PHP 8.2 libssl 3.0 MySQL 8.0 X Serveur Prod PHP 7.4 libssl 1.1 absente Conflits de versions AVEC DOCKER Conteneur PHP 8.2 + libssl 3.0 MySQL 8.0 App code Machine Dev Conteneur PHP 8.2 + libssl 3.0 MySQL 8.0 App code Serveur Prod Environnement identique

Sans Docker : conflits de versions entre machines. Avec Docker : l’environnement voyage avec l’application.

En une phrase Docker empaquette votre application avec toutes ses dépendances dans une boite isolée appelée conteneur, qui fonctionnera de façon identique sur n’importe quelle machine disposant de Docker.

02 Les quatre concepts fondamentaux

Avant de se lancer, il faut assimiler quatre notions clés.

Dockerfile

La recette de construction. Un fichier texte qui décrit comment assembler l’image.

Image

Le modele figé, en lecture seule, construit à partir du Dockerfile. On la partage.

Conteneur

L’image en cours d’execution. Un processus isolé, avec son propre systeme de fichiers.

Registry

Le depot d’images (Docker Hub, GHCR…). On y pousse et on y tire des images.

Moteur Docker (hote Linux / Mac / Windows) Conteneur A nginx:1.25 Conteneur B php-fpm:8.2 Conteneur C mysql:8.0 Conteneur D redis:7 Tous les conteneurs partagent le meme noyau Linux de l’hote

Chaque conteneur est isolé des autres mais partage le noyau du systeme hote — contrairement a une machine virtuelle.

03 Architecture : Docker vs Machine Virtuelle

La difference fondamentale entre un conteneur et une VM.

MACHINE VIRTUELLE Materiel physique (CPU, RAM) Hyperviseur (VMware, KVM, VirtualBox) VM 1 OS invité complet Binaires / libs Application ~1-10 Go, demarrage lent VM 2 OS invité complet Binaires / libs Application ~1-10 Go, demarrage lent DOCKER Materiel physique (CPU, RAM) OS hote + noyau Linux Docker Engine (daemon) Cont. 1 libs seules App A Mb, demarre en ms Cont. 2 libs seules App B Mb, demarre en ms Cont. 3 libs seules App C Mb, demarre en ms

La VM emule du materiel complet et embarque un OS entier. Le conteneur ne partage que les processus isolés sur le meme noyau hote.

04 Le flux de travail : Dockerfile → Image → Conteneur

Trois étapes simples pour passer du code a un service en fonctionnement.

Dockerfile Recette texte FROM, RUN, COPY… vous l’ecrivez docker build Image Instantane figé lecture seule, partageable docker push/pull docker run Conteneur Image + couche ecriture processus vivant et isole votre service tourne

Un Dockerfile est construit en image par docker build, puis l’image est instanciée en conteneur par docker run.

05 Installation

Docker s’installe en quelques minutes sur Linux, Mac et Windows.

Sur un serveur Linux (Debian / Ubuntu), la méthode recommandée est d’utiliser le dépôt officiel de Docker. On ajoute la clé GPG, le dépôt, puis on installe le paquet.

Terminal — Debian / Ubuntu
# Ajouter la clé GPG et le dépôt officiel
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

echo "deb [signed-by=/usr/share/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list

# Installer Docker Engine + Compose
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Ajouter votre utilisateur au groupe docker (évite sudo)
sudo usermod -aG docker $USER
newgrp docker

# Vérification
docker version
docker run hello-world
Proxmox / LXC Dans un conteneur LXC sur Proxmox, Docker nécessite que le conteneur soit non privilegié avec keyctl actif ou en mode privilégié. Dans les options du CT, activer Nesting et keyctl sous Features. Pour un usage homelab, un conteneur LXC privilégié est le chemin le plus simple.

06 Écrire un Dockerfile

Chaque instruction ajoute une couche a l’image finale.

COUCHES D’UNE IMAGE FROM debian:bookworm-slim — image de base RUN apt-get install -y php8.2 — paquets COPY . /app — fichiers de l’application WORKDIR /app — répertoire de travail EXPOSE 8080 — port déclaré CMD [« php », « -S », « 0.0.0.0:8080 »] — commande Chaque instruction = une couche immuable

Docker construit l’image par empilement de couches. Les couches non modifiées sont réutilisées du cache lors des reconstructions.

Dockerfile — exemple commenté
# Image de base officielle
FROM php:8.2-cli

# Métadonnées
LABEL maintainer="f4hxn@example.com"

# Installer des dépendances système
RUN apt-get update && apt-get install -y \
    libzip-dev unzip \
    && docker-php-ext-install zip \
    && rm -rf /var/lib/apt/lists/*

# Répertoire de travail dans le conteneur
WORKDIR /app

# Copier les fichiers de l'application
COPY . .

# Port que le service écoute
EXPOSE 8080

# Commande exécutée au démarrage du conteneur
CMD ["php", "-S", "0.0.0.0:8080", "-t", "public"]

07 Commandes essentielles

Les commandes Docker que l’on utilise au quotidien.

Commande Description
docker build -t monapp .Construire une image depuis le Dockerfile du dossier courant, taguée monapp
docker run -d -p 8080:80 monappLancer un conteneur en arrière-plan, port hôte 8080 → port conteneur 80
docker psLister les conteneurs en cours d’exécution
docker ps -aTous les conteneurs, y compris arrêtés
docker exec -it MON_ID bashOuvrir un shell interactif dans un conteneur vivant
docker logs -f MON_IDSuivre les logs en temps réel
docker stop / rm MON_IDArrêter puis supprimer un conteneur
docker imagesLister les images locales
docker pull nginx:1.25Télécharger une image depuis Docker Hub
docker push mon-registry/monappPousser une image vers un registry
docker volume lsLister les volumes persistants
docker network lsLister les réseaux Docker
docker system prune -aNettoyer images, conteneurs et volumes inutilisés

08 Docker Compose : orchestrer plusieurs services

Un seul fichier YAML pour décrire et démarrer toute une pile applicative.

En production ou en homelab, une application est rarement un service unique. Un site web typique comprend un serveur web, un interpréteur PHP, une base de données et un cache. Docker Compose permet de décrire tous ces services dans un fichier compose.yaml et de les démarrer d’une seule commande.

compose.yaml — pile LEMP classique
services:

  # Serveur web
  nginx:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./public:/var/www/html
    depends_on:
      - php

  # Interpréteur PHP-FPM
  php:
    build: .
    volumes:
      - ./public:/var/www/html
    environment:
      - APP_ENV=production

  # Base de données
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: monapp
    volumes:
      - db_data:/var/lib/mysql

  # Cache Redis
  redis:
    image: redis:7-alpine

volumes:
  db_data:
Terminal — commandes Compose
# Démarrer toute la pile en arrière-plan
docker compose up -d

# Voir l'état de tous les services
docker compose ps

# Logs de la pile entière
docker compose logs -f

# Arrêter et supprimer les conteneurs (volumes conservés)
docker compose down

# Tout reconstruire
docker compose up -d --build
Réseau Docker interne (bridge) nginx port 80 nginx:1.25-alpine hote:80 Internet 9000 php php-fpm build local 3306 db MySQL 8.0 volume : db_data redis Redis 7 cache mémoire

Avec Compose, tous les services communiquent via un réseau interne Docker. Seul Nginx est exposé vers l’extérieur sur le port 80.

09 Volumes et persistance des données

Par défaut un conteneur est éphémère : toutes ses données disparaissent à l’arrêt.

Pour conserver des données entre les redémarrages (base de données, uploads, configuration), on utilise des volumes. Docker propose trois mécanismes :

Volume nommé

Géré par Docker. Idéal pour les bases de données. db_data:/var/lib/mysql

Bind mount

Dossier de l’hôte monté dans le conteneur. Parfait pour le développement. ./src:/app

tmpfs

tmpfs

En mémoire RAM uniquement. Données non persistées, haute vitesse. Pour les secrets temporaires.

10 Réseaux Docker

Docker crée des réseaux virtuels pour isoler et connecter les conteneurs.

Type de réseau Comportement Cas d’usage
bridge Réseau privé par défaut. Les conteneurs communiquent entre eux par nom. Applications multi-services (Compose)
host Le conteneur partage directement la pile réseau de l’hôte. Haute performance, monitoring réseau
none Aucune interface réseau. Isolation totale. Traitement hors-ligne, sécurité maximale
overlay Réseau multi-hôtes (Docker Swarm / Kubernetes). Clusters distribués
macvlan Le conteneur obtient une adresse MAC / IP sur le réseau physique. Intégration réseau locale (homelab, VLAN)
Astuce homelab Le réseau macvlan est particulièrement utile pour donner une vraie adresse IP LAN à un conteneur (Pi-hole, AdGuard, Unifi Controller…) sans NAT, en le faisant apparaître comme une machine physique sur votre réseau.

11 Bonnes pratiques

Quelques règles simples pour des images propres et sécurisées.

Utiliser des images de base légères Préférer les variantes -alpine ou -slim : php:8.2-fpm-alpine au lieu de php:8.2-fpm. La surface d’attaque et la taille sont réduites drastiquement.
Ne pas lancer en root Ajouter un utilisateur dédié dans le Dockerfile : RUN useradd -m appuser puis USER appuser. Un processus compromis ne dispose alors pas des droits root.
Ordonner les instructions par fréquence de changement Placer les instructions qui changent rarement (installation de paquets) en haut, et celles qui changent souvent (copie du code) en bas. Docker réutilise les couches du cache pour les instructions inchangées.
Utiliser un fichier .dockerignore Comme un .gitignore, il exclut les fichiers inutiles du contexte de build : node_modules, .git, fichiers de log, .env
.dockerignore — exemple
# Exclure du contexte de build
.git
.env
*.log
node_modules
vendor
tests
*.md
.dockerignore

12 Glossaire rapide

TermeDéfinition
DaemonLe service d’arrière-plan dockerd qui gère les conteneurs et images sur la machine hôte.
RegistryDépôt d’images (Docker Hub, GHCR, votre propre registry avec Gitea/Harbor).
TagVersion d’une image : nginx:1.25, monapp:latest, monapp:v2.3.
LayerCouche immuable de l’image, chacune correspondant à une instruction du Dockerfile.
NamespaceMécanisme Linux d’isolation (PID, réseau, montages…) sur lequel repose Docker.
cgroupMécanisme Linux de limitation de ressources (CPU, RAM) utilisé par Docker.
Docker ComposeOutil d’orchestration locale multi-conteneurs via un fichier YAML.
Docker SwarmOrchestrateur natif de Docker pour clusters multi-serveurs (alternatif à Kubernetes).
HealthcheckInstruction Dockerfile qui vérifie périodiquement que le service fonctionne.
EntrypointCommande principale du conteneur, toujours exécutée. CMD lui passe des arguments.
F4HXN — Homelab & Infrastructure — Docker simplement expliqué — 2025

Laisser un commentaire