6.5 KiB
6.5 KiB
marp, theme, paginate, backgroundColor, footer, style
| marp | theme | paginate | backgroundColor | footer | style |
|---|---|---|---|---|---|
| true | default | true | Conteneurisation - Partie 2 - 2025 | section { font-family: 'Arial', sans-serif; } h1 { color: #2496ed; } h2 { color: #384c54; } |
Docker Networks & Dockerfile
IUT Sénart-Fontainebleau
2025
Plan du cours
-
Docker Networks
- Types de réseaux
- Communication entre conteneurs
- Use cases et bonnes pratiques
- Exercices pratiques
-
Dockerfile
- Construction d'images
- Multi-stage builds
- Optimisation et sécurité
- Cas pratiques
1. Docker Networks
Pourquoi les réseaux Docker ?
- Isolation des conteneurs
- Communication sécurisée
- Simulation d'infrastructure
- Environnements multi-conteneurs
- Séparation des préoccupations
Types de réseaux Docker
Bridge (default)
- Réseau privé interne
- Communication entre conteneurs
- Port mapping pour accès externe
# Création d'un réseau bridge personnalisé
docker network create --driver bridge my-network
# Lancement d'un conteneur sur ce réseau
docker run --network my-network --name web1 nginx
# Inspection du réseau
docker network inspect my-network
Types de réseaux Docker
Host
- Utilise la stack réseau de l'hôte
- Performance maximale
- Moins sécurisé
- Cas d'usage : haute performance nécessaire
# Lancement en mode host
docker run --network host nginx
# Vérification des ports utilisés
ss -tunlp
Types de réseaux Docker
None
- Aucune connectivité réseau
- Isolation totale
- Pour les traitements isolés
- Cas d'usage : scripts de traitement batch
# Isolation complète
docker run --network none nginx
# Vérification de l'isolation
docker exec [container-id] ping 8.8.8.8
Communication entre conteneurs
Même réseau bridge
# Création du réseau
docker network create app-network
# Déploiement d'une stack web
docker run -d --network app-network --name frontend nginx
docker run -d --network app-network --name backend api
docker run -d --network app-network --name db postgres
# Test de communication
docker exec frontend ping backend
docker exec backend ping db
DNS dans Docker
Service Discovery
- Résolution automatique des noms
- Service discovery intégré
- Facilite la mise à l'échelle
# Communication par nom de service
http://backend:8080/api
http://db:5432
# Test de résolution DNS
docker exec frontend nslookup backend
docker exec frontend wget -qO- http://backend/health
Inspection et Debug Réseau
Outils disponibles
# Voir les réseaux
docker network ls
# Détails d'un réseau
docker network inspect bridge
# Connecter/Déconnecter à chaud
docker network connect app-network container1
docker network disconnect app-network container1
# Traces réseau
docker logs --follow container1
2. Pourquoi des Dockerfiles ?
Problèmes résolus
- "Ça marche sur ma machine"
- Dépendances manquantes
- Versions différentes
- Configuration manuelle
Avantages
- Infrastructure as Code (IaC)
- Reproductibilité garantie
- Déploiement automatisé
- Tests cohérents
- Documentation vivante
Structure d'un Dockerfile Avancé
# Base image selection
FROM alpine:3.14 AS builder
# Métadonnées détaillées
LABEL maintainer="name@example.com" \
version="1.0" \
description="Application web" \
environment="production"
# Variables d'environnement
ENV APP_HOME=/app \
APP_USER=webuser \
APP_ENV=prod
# Création utilisateur dédié
RUN adduser -D -h $APP_HOME $APP_USER
# Installation des dépendances
RUN apk add --no-cache \
nodejs \
npm \
git
# Configuration du workdir
WORKDIR $APP_HOME
# Copie et permissions
COPY --chown=$APP_USER:$APP_USER . .
# Switch utilisateur
USER $APP_USER
# Healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -q localhost:3000/health || exit 1
# Commande de démarrage
CMD ["node", "app.js"]
Multi-stage builds
Exemple Complet
# Stage 1: Build
FROM node:16 AS builder
WORKDIR /build
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Stage 2: Test
FROM builder AS tester
RUN npm run test
Multi-stage builds
Exemple Complet
# Stage 3: Production
FROM nginx:alpine
COPY --from=builder /build/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
Optimisation des images
Techniques avancées
- Utilisation de .dockerignore
node_modules
*.log
.git
tests
docs
Optimisation des images
- Ordonnancement des layers
# Bon ordre (moins de rebuilds)
COPY package.json .
RUN npm install
COPY . .
# Mauvais ordre (rebuilds fréquents)
COPY . .
RUN npm install
Optimisation des images
- Nettoyage des caches
RUN apt-get update && \
apt-get install -y package && \
rm -rf /var/lib/apt/lists/*
Variables d'environnement et Secrets
Bonnes pratiques
# Variables build-time
ARG VERSION=1.0
# Variables runtime
ENV APP_VERSION=${VERSION} \
NODE_ENV=production
# Usage avec arguments
docker build --build-arg VERSION=2.0 .
Variables d'environnement et Secrets
Secrets en production
# Utilisation de docker secrets
docker secret create db_password password.txt
docker service create --secret db_password ...
Healthcheck Détaillé
Implémentation robuste
HEALTHCHECK --interval=30s \
--timeout=3s \
--start-period=60s \
--retries=3 \
CMD wget -q --spider \
http://localhost:80/health || exit 1
Monitoring
# Vérification status
docker inspect --format='{{.State.Health.Status}}' container
Sécurité et Bonnes Pratiques
Sécurisation des conteneurs
- Utilisateur non-root
- Images officielles ou vérifiées
- Scan des vulnérabilités
- Mise à jour régulière des bases
- Principe du moindre privilège
# Exemple sécurisé
FROM alpine:3.14
RUN adduser -D appuser
USER appuser
Déploiement et Tests
Workflow complet
# Build avec tag
docker build -t app:latest .
# Test local
docker run --rm app:latest
# Publication
docker tag app:latest registry/app:latest
docker push registry/app:latest
# Déploiement
docker pull registry/app:latest
docker run -d app:latest
Questions & Travaux Pratiques
Explication de quelques notions pour le TP
Place aux exercices pratiques !