--- marp: true theme: default paginate: true backgroundColor: #fff footer: 'Conteneurisation - Docker Compose - 2025' style: | section { font-family: 'Arial', sans-serif; } h1 { color: #2496ed; } h2 { color: #384c54; } .columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; } --- # Docker Compose ### IUT Sénart-Fontainebleau #### 2025 --- # Plan du cours 1. Introduction à Docker Compose - Problématique multi-conteneurs - Avantages de Docker Compose - Structure d'un fichier docker-compose.yml 2. Démonstration en direct - Application web avec base de données - Configuration et déploiement - Gestion des services --- # 1. Pourquoi Docker Compose ?
## Cas d'usage courant - Application web (Frontend) - API (Backend) - Base de données - Cache Redis - Proxy reverse
## Sans Docker Compose ```bash docker run --name db -e POSTGRES_PASSWORD=secret postgres docker run --name backend --link db:db myapp docker run --name frontend -p 80:80 nginx ```
--- # Problèmes sans Docker Compose
## Gestion manuelle - Ordre de démarrage - Variables d'environnement - Configuration réseau - Volumes persistants - Redémarrage automatique
## Risques - Erreurs humaines - Configuration incohérente - Perte de temps - Documentation complexe
--- # Docker Compose : La solution
## Avantages - Un seul fichier de configuration - Gestion des dépendances - Environnement reproductible - Commandes simplifiées - Documentation as Code
```yaml version: '3' services: web: build: . ports: - "80:80" db: image: postgres ```
--- # Structure du fichier docker-compose.yml ## Éléments principaux ```yaml version: '3' # Version de la syntaxe services: # Définition des conteneurs networks: # Configuration réseau volumes: # Stockage persistant configs: # Configuration applicative secrets: # Données sensibles ``` --- # 2. Démonstration en direct ## Préparation de l'environnement 1. Structure du projet ```bash mkdir demo-docker-compose cd demo-docker-compose ``` 2. Création des dossiers ```bash mkdir api frontend touch docker-compose.yml .env ``` --- ## Étape 1: Configuration de base 1. Création du fichier .env ```env # .env POSTGRES_USER=demouser POSTGRES_PASSWORD=secret123 POSTGRES_DB=demodb NODE_ENV=development ``` --- 2. Premier docker-compose.yml ```yaml version: '3.8' services: db: image: postgres:13 environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} ``` 3. Test initial ```bash docker compose up db -d docker compose ps docker compose logs db ``` --- ## Étape 2: API Node.js 1. Structure de l'API ```bash cd api npm init -y npm install express pg cors ``` --- 2. API simple (index.js) ```javascript const express = require('express'); const cors = require('cors'); const { Pool } = require('pg'); const app = express(); app.use(cors()); const pool = new Pool({ host: 'db', user: process.env.POSTGRES_USER, password: process.env.POSTGRES_PASSWORD, database: process.env.POSTGRES_DB }); app.get('/health', (req, res) => { res.json({ status: 'ok' }); }); app.listen(5000, () => console.log('API running')); ``` --- 3. Création du Dockerfile API ```dockerfile FROM node:16-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["node", "index.js"] ``` --- 4. Ajout au docker-compose.yml ```yaml api: build: ./api environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} depends_on: - db ``` --- ## Étape 3: Frontend Vite 1. Création du frontend
```bash npm create vite@latest . # Suivre les instructions pour sélectionner React et TypeScript/JavaScript npm install # ajouter le fichier import HealthCheck from './HealthCheck' ```
2. Dockerfile Frontend ```dockerfile FROM node:18-alpine as build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Production stage FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ```
--- 3. Ajout au docker-compose.yml ```yaml frontend: build: ./frontend environment: - VITE_API_URL=http://localhost:5000 ports: - "80:80" depends_on: - api ``` --- 4. Configuration Vite (vite.config.js) ```javascript export default defineConfig({ plugins: [react()], server: { host: true, // Nécessaire pour Docker port: 5173, watch: { usePolling: true // Pour le hot reload dans Docker } } }) ``` --- ## Étape 4: Nginx Reverse Proxy 1. Configuration Nginx ```bash cd frontend touch nginx.conf ``` --- 2. nginx.conf basique ```nginx server { listen 80; server_name localhost; # Racine du site React root /usr/share/nginx/html; index index.html; # Configuration pour React Router location / { try_files $uri $uri/ /index.html; } # Proxy vers le backend location /api/ { proxy_pass http://api:5000/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # Configuration pour les assets statiques location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } ``` --- ## Démonstration du déploiement 1. Lancement complet ```bash docker compose up -d ``` 2. Vérification des services ```bash docker compose ps docker compose logs ``` --- # Démonstration : Structure du projet ```bash ./mon-app/ ├── docker-compose.yml ├── frontend/ │ ├── Dockerfile │ └── src/ ├── api/ │ ├── Dockerfile │ └── src/ └── .env ``` --- # Commandes essentielles ## Démarrage ```bash # Démarrer tous les services docker compose up # Mode détaché docker compose up -d ``` --- # Commandes essentielles ## Gestion ```bash # Voir les logs docker compose logs # État des services docker compose ps # Arrêter les services docker compose down ``` --- # Variables d'environnement ## Fichier .env ```env POSTGRES_USER=myapp POSTGRES_PASSWORD=secret POSTGRES_DB=myapp API_PORT=3000 ``` ## Utilisation dans docker-compose.yml ```yaml services: api: environment: - DB_USER=${POSTGRES_USER} - DB_PASSWORD=${POSTGRES_PASSWORD} ``` --- # Réseaux Docker Compose ## Configuration réseau ```yaml services: frontend: networks: - frontend-net api: networks: - frontend-net - backend-net networks: frontend-net: backend-net: internal: true ``` --- # Volumes et persistance ## Types de volumes ```yaml services: db: volumes: # Volume nommé - db-data:/var/lib/postgresql/data # Bind mount - ./config:/etc/postgresql # Volume anonyme - /var/lib/postgresql/data volumes: db-data: ``` --- # Dépendances entre services ## Configuration ```yaml services: api: depends_on: db: condition: service_healthy db: healthcheck: test: ["CMD", "pg_isready"] interval: 10s timeout: 5s retries: 5 ``` --- # Mise à l'échelle ## Scale services ```bash # Lancer 3 instances de l'API docker compose up --scale api=3 # Configuration load balancer services: api: deploy: replicas: 3 ``` --- # Surveillance et debugging ## Logs ```bash # Suivre les logs en temps réel docker compose logs -f api # Logs depuis un timestamp docker compose logs --since 30m ``` ## Shell dans un conteneur ```bash docker compose exec api sh ``` --- # Proxy Reverse avec Docker Compose ## Pourquoi un proxy reverse ? - Répartition de charge - SSL/TLS termination - Sécurité et filtrage - Routage des requêtes - Mise en cache --- ## Exemple de configuration Nginx ```nginx # nginx.conf http { upstream frontend { server frontend:3000; } upstream api { server api:5000; } server { listen 80; server_name example.com; location / { proxy_pass http://frontend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /api { proxy_pass http://api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` ## Scale avec Nginx ```yaml services: nginx: image: nginx:alpine api: deploy: replicas: 3 frontend: deploy: replicas: 2 # nginx.conf upstream api { server api_1:5000; server api_2:5000; server api_3:5000; } ``` --- # Bonnes pratiques
## Organisation 1. Séparer les environnements 2. Utiliser les variables d'environnement 3. Gérer les secrets correctement 4. Optimiser les builds 5. Monitorer les services
## Sécurité 1. Limiter les ports exposés 2. Utiliser des réseaux internes 3. Mettre à jour les images 4. Scan des vulnérabilités
--- # Questions ? N'hésitez pas à poser vos questions ! ---