392 lines
6.5 KiB
Markdown
392 lines
6.5 KiB
Markdown
---
|
|
marp: true
|
|
theme: default
|
|
paginate: true
|
|
backgroundColor: #fff
|
|
footer: 'Conteneurisation - Partie 2 - 2025'
|
|
style: |
|
|
section {
|
|
font-family: 'Arial', sans-serif;
|
|
}
|
|
h1 {
|
|
color: #2496ed;
|
|
}
|
|
h2 {
|
|
color: #384c54;
|
|
}
|
|
---
|
|
|
|
# Docker Networks & Dockerfile
|
|
### IUT Sénart-Fontainebleau
|
|
#### 2025
|
|
|
|
---
|
|
|
|
# Plan du cours
|
|
1. Docker Networks
|
|
- Types de réseaux
|
|
- Communication entre conteneurs
|
|
- Use cases et bonnes pratiques
|
|
- Exercices pratiques
|
|
|
|
2. 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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é
|
|
|
|
```dockerfile
|
|
# 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
|
|
```
|
|
|
|
---
|
|
```dockerfile
|
|
# 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
|
|
```dockerfile
|
|
# 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
|
|
|
|
```dockerfile
|
|
# 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
|
|
1. Utilisation de .dockerignore
|
|
```dockerignore
|
|
node_modules
|
|
*.log
|
|
.git
|
|
tests
|
|
docs
|
|
```
|
|
|
|
---
|
|
|
|
# Optimisation des images
|
|
|
|
2. Ordonnancement des layers
|
|
```dockerfile
|
|
# Bon ordre (moins de rebuilds)
|
|
COPY package.json .
|
|
RUN npm install
|
|
COPY . .
|
|
|
|
# Mauvais ordre (rebuilds fréquents)
|
|
COPY . .
|
|
RUN npm install
|
|
```
|
|
|
|
---
|
|
|
|
# Optimisation des images
|
|
|
|
3. Nettoyage des caches
|
|
```dockerfile
|
|
RUN apt-get update && \
|
|
apt-get install -y package && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
```
|
|
|
|
---
|
|
|
|
# Variables d'environnement et Secrets
|
|
|
|
## Bonnes pratiques
|
|
```dockerfile
|
|
# 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
|
|
```bash
|
|
# Utilisation de docker secrets
|
|
docker secret create db_password password.txt
|
|
docker service create --secret db_password ...
|
|
```
|
|
|
|
---
|
|
|
|
# Healthcheck Détaillé
|
|
|
|
## Implémentation robuste
|
|
```dockerfile
|
|
HEALTHCHECK --interval=30s \
|
|
--timeout=3s \
|
|
--start-period=60s \
|
|
--retries=3 \
|
|
CMD wget -q --spider \
|
|
http://localhost:80/health || exit 1
|
|
```
|
|
|
|
## Monitoring
|
|
```bash
|
|
# 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
|
|
|
|
```dockerfile
|
|
# Exemple sécurisé
|
|
FROM alpine:3.14
|
|
RUN adduser -D appuser
|
|
USER appuser
|
|
```
|
|
|
|
---
|
|
|
|
# Déploiement et Tests
|
|
|
|
## Workflow complet
|
|
```bash
|
|
# 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 ! |