Docker et Conteneurisation : Guide Complet pour la Production
Maîtrisez Docker et la conteneurisation : images optimisées, orchestration, sécurité, monitoring et déploiement en production.
Publié le
16 décembre 2024
Lecture
21 min
Vues
0
Auteur
Florian Courouge
Docker
Containers
Orchestration
Security
Production
DevOps
Table des matières
📋 Vue d'ensemble rapide des sujets traités dans cet article
Cliquez sur les sections ci-dessous pour naviguer rapidement
Docker et Conteneurisation : Guide Complet pour la Production
Docker a révolutionné le déploiement d'applications en simplifiant la conteneurisation. Ce guide couvre tous les aspects essentiels pour maîtriser Docker en production, de la création d'images optimisées à l'orchestration complexe.
# Dockerfile sécurisé
FROM node:18-alpine AS base
# Mise à jour des packages système
RUN apk update && apk upgrade && \
apk add --no-cache dumb-init && \
rm -rf /var/cache/apk/*
# Créer un utilisateur non-root avec UID/GID spécifiques
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001 -G nodejs
# Définir le répertoire de travail
WORKDIR /app
# Changer la propriété du répertoire
RUN chown -R nextjs:nodejs /app
# Copier les fichiers avec les bonnes permissions
COPY --chown=nextjs:nodejs package*.json ./
# Installer les dépendances
USER nextjs
RUN npm ci --only=production && npm cache clean --force
# Copier le code source
COPY --chown=nextjs:nodejs . .
# Supprimer les fichiers sensibles
RUN rm -rf .git .env.example README.md
# Configuration de sécurité
USER nextjs
# Utiliser dumb-init comme PID 1
ENTRYPOINT ["dumb-init", "--"]
# Commande par défaut
CMD ["node", "server.js"]
Scan de Sécurité
#!/bin/bash
# security-scan.sh
# Installation de Trivy pour le scan de vulnérabilités
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# Fonction de scan d'image
scan_image() {
local image=$1
echo "Scanning image: $image"
# Scan des vulnérabilités
trivy image --severity HIGH,CRITICAL --format table $image
# Scan des secrets
trivy image --scanners secret $image
# Scan des configurations
trivy image --scanners config $image
# Générer un rapport JSON
trivy image --format json --output ${image//\//_}-scan.json $image
}
# Scan de toutes les images locales
for image in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>"); do
scan_image $image
done
# Analyse des conteneurs en cours d'exécution
echo "Analyzing running containers..."
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" > running-containers.txt
# Vérification des configurations Docker
echo "Checking Docker daemon configuration..."
docker system info | grep -E "(Security Options|Cgroup Driver|Storage Driver)"
# Audit des volumes et réseaux
echo "Auditing volumes and networks..."
docker volume ls
docker network ls
#!/bin/bash
# deploy.sh
set -e
# Configuration
REGISTRY="registry.example.com"
IMAGE_NAME="myapp"
VERSION=${1:-latest}
ENVIRONMENT=${2:-staging}
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}
error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
exit 1
}
# Vérifications préalables
check_prerequisites() {
log "Checking prerequisites..."
command -v docker >/dev/null 2>&1 || error "Docker is not installed"
command -v docker-compose >/dev/null 2>&1 || error "Docker Compose is not installed"
docker info >/dev/null 2>&1 || error "Docker daemon is not running"
log "Prerequisites check passed"
}
# Build de l'image
build_image() {
log "Building image: $REGISTRY/$IMAGE_NAME:$VERSION"
docker build \
--build-arg VERSION=$VERSION \
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
--build-arg VCS_REF=$(git rev-parse --short HEAD) \
-t $REGISTRY/$IMAGE_NAME:$VERSION \
-t $REGISTRY/$IMAGE_NAME:latest \
.
log "Image built successfully"
}
# Test de l'image
test_image() {
log "Testing image..."
# Démarrer le conteneur de test
docker run -d --name test-container \
-p 3001:3000 \
$REGISTRY/$IMAGE_NAME:$VERSION
# Attendre que l'application soit prête
sleep 10
# Test de santé
if curl -f http://localhost:3001/health; then
log "Health check passed"
else
error "Health check failed"
fi
# Nettoyer
docker stop test-container
docker rm test-container
log "Image testing completed"
}
# Push vers le registry
push_image() {
log "Pushing image to registry..."
docker push $REGISTRY/$IMAGE_NAME:$VERSION
docker push $REGISTRY/$IMAGE_NAME:latest
log "Image pushed successfully"
}
# Déploiement
deploy() {
log "Deploying to $ENVIRONMENT..."
# Sélectionner le fichier de configuration
COMPOSE_FILE="docker-compose.$ENVIRONMENT.yml"
if [[ ! -f $COMPOSE_FILE ]]; then
error "Compose file not found: $COMPOSE_FILE"
fi
# Déploiement avec rolling update
export IMAGE_TAG=$VERSION
docker-compose -f $COMPOSE_FILE pull
docker-compose -f $COMPOSE_FILE up -d --remove-orphans
# Vérifier le déploiement
sleep 15
if docker-compose -f $COMPOSE_FILE ps | grep -q "Up"; then
log "Deployment successful"
else
error "Deployment failed"
fi
}
# Rollback
rollback() {
local previous_version=$1
warn "Rolling back to version: $previous_version"
export IMAGE_TAG=$previous_version
docker-compose -f docker-compose.$ENVIRONMENT.yml up -d --remove-orphans
log "Rollback completed"
}
# Nettoyage
cleanup() {
log "Cleaning up old images..."
# Supprimer les images non utilisées
docker image prune -f
# Supprimer les conteneurs arrêtés
docker container prune -f
log "Cleanup completed"
}
# Fonction principale
main() {
case ${1:-deploy} in
"build")
check_prerequisites
build_image
test_image
;;
"push")
push_image
;;
"deploy")
check_prerequisites
deploy
;;
"rollback")
rollback $2
;;
"cleanup")
cleanup
;;
"full")
check_prerequisites
build_image
test_image
push_image
deploy
cleanup
;;
*)
echo "Usage: $0 {build|push|deploy|rollback|cleanup|full} [version] [environment]"
exit 1
;;
esac
}
main "$@"
💡Conclusion
Docker et la conteneurisation offrent de nombreux avantages pour le déploiement d'applications :
Avantages Clés
•Portabilité entre environnements
•Isolation des applications
•Déploiements reproductibles
•Scalabilité horizontale
Bonnes Pratiques
•Images multi-stage optimisées
•Sécurité par défaut
•Monitoring et logging centralisés
•Automatisation CI/CD
Considérations Production
•Orchestration avec Kubernetes
•Gestion des secrets
•Sauvegarde et récupération
•Monitoring des performances
La maîtrise de Docker est essentielle pour tout professionnel DevOps moderne. Les techniques présentées dans cet article vous permettront de déployer des applications conteneurisées robustes et sécurisées en production.
Pour un accompagnement dans la conteneurisation de vos applications, contactez-moi pour une consultation personnalisée.
À propos de l'auteur
Florian Courouge - Expert DevOps et Apache Kafka avec plus de 5 ans d'expérience dans l'architecture de systèmes distribués et l'automatisation d'infrastructures.
Cet article vous a été utile ?
Découvrez mes autres articles techniques ou contactez-moi pour discuter de vos projets DevOps et Kafka.