Créer ses images Docker : Dockerfile, volumes et réseaux
🎯 Objectifs
- Configurer le port mapping et les réseaux Docker
- Persister les données avec les volumes
- Écrire un Dockerfile pour construire une image
- Appliquer les bonnes pratiques de construction d'images
📋 Prérequis
- Docker Débutant - images, conteneurs, commandes de base
- Docker installé et fonctionnel
🌐 Ports et Réseaux
Port mapping
Le flag -p redirige un port de l'hôte vers le conteneur :
# Port 8080 de l'hôte → port 80 du conteneur
docker run -d -p 8080:80 nginx
# Plusieurs ports
docker run -d -p 8080:80 -p 8443:443 nginxTypes de réseaux
| Type | Description | Cas d'usage |
|---|---|---|
| bridge | Réseau isolé par défaut | Conteneurs sur la même machine |
| host | Partage le réseau de l'hôte | Performance maximale |
| none | Aucun réseau | Conteneur totalement isolé |
Réseaux personnalisés
Les conteneurs sur un réseau personnalisé se découvrent par nom DNS :
# Créer un réseau
docker network create mon-reseau
# Lancer deux conteneurs sur ce réseau
docker run -d --name api --network mon-reseau node-api
docker run -d --name db --network mon-reseau postgres:16💡 Depuis le conteneur
api, vous pouvez atteindre la base avecdb:5432- Docker résout le nom automatiquement.
# Gestion des réseaux
docker network ls
docker network inspect mon-reseau
docker network rm mon-reseau💾 Volumes et Données Persistantes
Pourquoi ?
Par défaut, les données d'un conteneur sont perdues à sa suppression. Les volumes permettent de persister les données.
Trois types de montage
| Type | Syntaxe | Cas d'usage |
|---|---|---|
| Bind mount | -v /chemin/hôte:/chemin/conteneur | Développement (code source) |
| Named volume | -v nom-volume:/chemin/conteneur | Production (bases de données) |
| tmpfs | --tmpfs /chemin | Données temporaires en mémoire |
Exemples pratiques
# Bind mount - synchroniser le code local
docker run -d -v $(pwd)/src:/app/src -p 3000:3000 node-app
# Named volume - persister les données PostgreSQL
docker run -d --name db \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16Gestion des volumes
docker volume ls
docker volume inspect pgdata
docker volume rm pgdata
docker volume prune # Supprimer les volumes inutilisés⚠️
docker volume prunesupprime tous les volumes non utilisés. Vérifiez avant d'exécuter.
📝 Dockerfile
Concept
Un Dockerfile est une recette pour construire une image. Chaque instruction crée une couche.
Exemple : application Node.js
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Instructions principales
| Instruction | Rôle | Exemple |
|---|---|---|
FROM | Image de base | FROM node:20-alpine |
WORKDIR | Répertoire de travail | WORKDIR /app |
COPY | Copier des fichiers | COPY . . |
RUN | Exécuter une commande au build | RUN npm install |
ENV | Variable d'environnement | ENV NODE_ENV=production |
ARG | Variable de build uniquement | ARG VERSION=1.0 |
EXPOSE | Documenter le port utilisé | EXPOSE 3000 |
CMD | Commande par défaut au lancement | CMD ["node", "app.js"] |
ENTRYPOINT | Point d'entrée fixe | ENTRYPOINT ["python"] |
USER | Utilisateur d'exécution | USER appuser |
HEALTHCHECK | Vérification de santé | HEALTHCHECK CMD curl -f http://localhost/ |
Construire et lancer
# Construire l'image
docker build -t mon-app:1.0 .
# Lancer un conteneur
docker run -d -p 3000:3000 mon-app:1.0Le fichier .dockerignore
Empêche de copier des fichiers inutiles dans l'image (comme .gitignore pour Git) :
node_modules
.git
.env
*.log
Dockerfile
.dockerignore💡 Un bon
.dockerignoreréduit la taille de l'image et accélère le build.
✨ Bonnes Pratiques Dockerfile
1. Exploiter le cache de couches
Copiez les dépendances avant le code source - les dépendances changent moins souvent :
COPY package*.json ./
RUN npm ci
COPY . .2. Minimiser le nombre de couches
Chaînez les commandes RUN avec && :
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*3. Utiliser un utilisateur non-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser⚠️ Ne jamais exécuter un conteneur en production en tant que
root.
4. Préférer COPY à ADD
COPY est explicite et prévisible. Réservez ADD uniquement si vous avez besoin de décompresser une archive.
⚠️ Erreurs Courantes
| Erreur | Cause | Solution |
|---|---|---|
COPY failed: file not found | Fichier absent ou dans .dockerignore | Vérifier le chemin et .dockerignore |
| Build lent après chaque changement | Mauvais ordre des instructions | Copier les dépendances avant le code |
| Image trop volumineuse | Image de base lourde | Utiliser une variante -alpine |
EACCES permission denied | Fichiers non accessibles par l'utilisateur | Vérifier USER et les permissions |
| Volume vide au démarrage | Bind mount écrase le contenu | Utiliser un named volume |
📌 Points Clés
- Le port mapping (
-p) expose les conteneurs sur le réseau hôte - Les réseaux personnalisés permettent la découverte DNS entre conteneurs
- Les volumes persistent les données au-delà du cycle de vie du conteneur
- Un Dockerfile est une recette reproductible pour construire une image
- Respectez l'ordre des instructions pour optimiser le cache de build
📚 Ressources
🚀 Prochaines étapes
Vous maîtrisez Dockerfile, volumes et réseaux. Passez à Docker en production :
- Docker Compose et optimisation pour la production - Docker Compose, multi-stage builds et production