Introduction à Docker pour développeurs web
Guide complet pour débuter avec Docker : concepts de base, installation, premiers conteneurs et exemples pratiques pour développeurs web. Parfait pour démystifier la containerisation.
Sommaire
- Introduction
- Qu’est-ce que Docker ?
- Installation de Docker
- Vos premiers pas avec Docker
- Containeriser une application web
- Docker Compose pour les applications multi-services
- Bonnes pratiques
- FAQ
Introduction
Docker est devenu incontournable dans le développement moderne, mais beaucoup de développeurs web hésitent encore à s’y mettre. Si vous faites partie de ceux qui trouvent Docker intimidant ou complexe, ce guide est fait pour vous !
Nous allons voir ensemble ce qu’est Docker, pourquoi il est si utile, et comment vous pouvez commencer à l’utiliser dés aujourd’hui avec des exemples concrets et simples.
Qu’est-ce que Docker ?
Les concepts de base
Imaginez que vous voulez partager votre application avec un collégue. Sans Docker, vous devez lui donner :
- Le code source
- La liste des dépendances
- Les instructions d’installation
- La version exacte de Node.js/Python/PHP à installer
- Les variables d’environnement
- Et croiser les doigts pour que éa marche sur sa machine !
Docker résout ce problème en “empaquetant” votre application avec tout ce dont elle a besoin dans un conteneur.
Un conteneur, c’est comme une boéte qui contient :
- Votre code
- Le runtime (Node.js, Python…)
- Les dépendances
- Les variables d’environnement
- Méme l’OS minimal nécessaire
Pourquoi utiliser Docker ?
“Ça marche sur ma machine” devient “Ça marche partout”
- Même environnement en développement, test et production
Isolation complète
- Chaque projet dans son propre conteneur
- Fini les conflits de versions
Déploiement simplifié
- Un seul fichier à déployer
- Rollback instantané possible
Développement d’équipe facilité
- Nouveau développeur opérationnel en minutes
- Environnement identique pour toute l’équipe
Installation de Docker
Sur Windows
- Téléchargez Docker Desktop depuis docker.com
- Installez avec les paramétres par défaut
- Redémarrez votre machine
- Vérifiez l’installation :
docker --version
Sur macOS
- Téléchargez Docker Desktop depuis docker.com
- Glissez l’application dans le dossier Applications
- Lancez Docker Desktop
- Vérifiez l’installation :
docker --version
Sur Linux
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Ajouter votre utilisateur au groupe docker
sudo usermod -aG docker $USER
# Redémarrer la session ou faire :
newgrp docker
# Vérifier l'installation
docker --version
Vos premiers pas avec Docker
Votre premier conteneur
Commenéons par le classique “Hello World” :
docker run hello-world
Cette commande :
- Télécharge l’image
hello-worldsi elle n’existe pas - Crée un conteneur à partir de cette image
- Exécute le conteneur
- Affiche un message de bienvenue
Testons avec quelque chose de plus concret :
# Lancer un serveur web Nginx
docker run -d -p 8080:80 nginx
# -d : en arriére-plan (détaché)
# -p 8080:80 : redirige le port 8080 de votre machine vers le port 80 du conteneur
Ouvrez http://localhost:8080 dans votre navigateur. Vous voyez la page d’accueil Nginx !
Les commandes essentielles
# Lister les conteneurs actifs
docker ps
# Lister tous les conteneurs (actifs + arrétés)
docker ps -a
# Arréter un conteneur
docker stop nom_ou_id_du_conteneur
# Supprimer un conteneur
docker rm nom_ou_id_du_conteneur
# Lister les images téléchargées
docker images
# Supprimer une image
docker rmi nom_de_l_image
# Voir les logs d'un conteneur
docker logs nom_ou_id_du_conteneur
Containeriser une application web
Exemple avec Node.js
Créons une application Node.js simple et containerisons-la.
1. Créez l’application :
package.json :
{
"name": "mon-app-docker",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.0"
}
}
server.js :
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
message: 'Hello from Docker!',
timestamp: new Date().toISOString()
});
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
2. Créez le Dockerfile :
# Utiliser l'image officielle Node.js
FROM node:18-alpine
# Définir le répertoire de travail
WORKDIR /app
# Copier les fichiers de dépendances
COPY package*.json ./
# Installer les dépendances
RUN npm install
# Copier le code source
COPY . .
# Exposer le port
EXPOSE 3000
# Commande de démarrage
CMD ["npm", "start"]
3. Construire et lancer :
# Construire l'image
docker build -t mon-app-node .
# Lancer le conteneur
docker run -d -p 3000:3000 --name mon-app mon-app-node
# Tester
curl http://localhost:3000
Exemple avec Python/Flask
1. L’application Flask :
app.py :
from flask import Flask, jsonify
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def hello():
return jsonify({
'message': 'Hello from Docker with Python!',
'timestamp': datetime.now().isoformat()
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port🔄000, debug=True)
requirements.txt :
Flask==2.3.3
2. Le Dockerfile :
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
3. Construction et lancement :
docker build -t mon-app-python .
docker run -d -p 5000:5000 --name mon-app-flask mon-app-python
Docker Compose pour les applications multi-services
Pour une vraie application, vous avez souvent besoin de plusieurs services : votre app, une base de données, un cache Redis, etc.
Docker Compose permet de gérer plusieurs conteneurs facilement.
docker-compose.yml :
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DB_HOST=db
depends_on:
- db
- redis
db:
image: postgres:15
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
postgres_data:
Commandes Docker Compose :
# Lancer tous les services
docker-compose up -d
# Voir les logs
docker-compose logs
# Arréter tous les services
docker-compose down
# Reconstruire et relancer
docker-compose up --build
Bonnes pratiques
Dockerfile optimisé
FROM node:18-alpine
# Créer un utilisateur non-root
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
# Copier les fichiers de dépendances en premier (pour le cache)
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# Copier le code source
COPY . .
# Changer le propriétaire des fichiers
RUN chown -R nextjs:nodejs /app
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
.dockerignore
Créez un .dockerignore pour exclure les fichiers inutiles :
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.vscode
Variables d’environnement
# Utiliser un fichier .env
docker run --env-file .env mon-app
# Ou passer des variables individuelles
docker run -e NODE_ENV=production -e PORT=3000 mon-app
Volumes pour la persistance
# Monter un volume pour les données
docker run -v /chemin/local:/app/data mon-app
# Volume nommé (recommandé)
docker run -v mon-volume:/app/data mon-app
FAQ
Docker vs Machine Virtuelle, quelle différence ?
Machine Virtuelle :
- Inclut un OS complet
- Plus lourde (plusieurs GB)
- Plus lente à démarrer
Docker :
- Partage l’OS de l’héte
- Plus léger (quelques MB à GB)
- Démarrage quasi-instantané
Où sont stockés mes conteneurs et images ?
Sur Linux : /var/lib/docker/
Sur Windows/Mac : Dans la VM de Docker Desktop
Comment debugger dans un conteneur ?
# Se connecter au conteneur en cours d'exécution
docker exec -it nom_conteneur sh
# Ou bash si disponible
docker exec -it nom_conteneur bash
Mes données disparaissent quand je supprime le conteneur !
Normal ! Utilisez des volumes :
docker run -v /chemin/local:/app/data mon-app
Comment mettre à jour mon application ?
- Reconstruisez l’image :
docker build -t mon-app:v2 . - Arrêtez l’ancien conteneur :
docker stop mon-app - Lancez le nouveau :
docker run -d --name mon-app-v2 mon-app:v2
Docker est-il sécurisé ?
Les bonnes pratiques incluent :
- Ne pas exécuter en tant que root dans le conteneur
- Scanner les images pour les vulnérabilités
- Utiliser des images officielles ou de confiance
- Maintenir Docker à jour
Docker simplifie énormément le déploiement et le développement. Commencez par containeriser une petite application, et vous verrez rapidement les bénéfices !