10 KiB
10 KiB
Inception - École 42
Description
Inception est un projet de l'École 42 qui consiste à créer une infrastructure complète avec Docker en utilisant des conteneurs personnalisés. Le projet déploie un stack LEMP (Linux, Nginx, MariaDB, PHP/WordPress) entièrement containerisé avec des images Docker créées from scratch.
Objectifs pédagogiques
- Maîtriser Docker et la containerisation
- Comprendre l'orchestration de services avec Docker Compose
- Créer des Dockerfiles optimisés et sécurisés
- Gérer les volumes persistants et réseaux Docker
- Apprendre l'administration système et sécurité
- Mettre en place une infrastructure LEMP complète
Architecture du projet
Stack technique
- 🌐 Nginx : Reverse proxy avec TLS v1.2/v1.3
- 🗄️ MariaDB : Base de données relationnelle
- 📝 WordPress : CMS avec PHP-FPM
- 🔐 SSL/TLS : Certificats auto-signés
- 🐳 Docker : Containerisation complète
Structure des fichiers
inception/
├── Makefile # Automatisation des tâches
└── srcs/
├── docker-compose.yml # Orchestration des services
├── .env # Variables d'environnement
└── requirements/ # Dockerfiles personnalisés
├── nginx/ # Reverse proxy
│ ├── Dockerfile
│ └── conf/
├── wordpress/ # CMS PHP
│ ├── Dockerfile
│ └── conf/
└── mariadb/ # Base de données
├── Dockerfile
└── conf/
Services containerisés
🌐 Nginx
- Image : Alpine Linux custom
- Port : 443 (HTTPS uniquement)
- Fonctionnalités :
- Reverse proxy vers WordPress
- Certificats SSL auto-signés
- Configuration TLS v1.2/v1.3
- Compression gzip
- Sécurité headers
📝 WordPress + PHP-FPM
- Image : Alpine Linux + PHP-FPM
- Fonctionnalités :
- Installation automatique WordPress
- Configuration multi-utilisateurs
- Connexion sécurisée à MariaDB
- Volumes persistants
- PHP optimisé pour production
🗄️ MariaDB
- Image : Alpine Linux + MariaDB
- Fonctionnalités :
- Base de données WordPress
- Utilisateurs multiples avec privilèges
- Volumes persistants
- Configuration optimisée
- Sécurité renforcée
Installation et déploiement
Prérequis
- Docker 20.10+
- Docker Compose 1.28+
- Make pour l'automatisation
- Système Linux recommandé
Configuration
1. Fichier d'environnement
Créer .env dans srcs/ :
# Database
DB_NAME=wordpress_db
DB_USER=wp_user
DB_PASSWORD=secure_password
DB_ROOT_PASSWORD=root_secure_password
# WordPress
WP_TITLE="Mon Site WordPress"
WP_ADMIN_USER=admin
WP_ADMIN_PASSWORD=admin_password
WP_ADMIN_EMAIL=admin@example.com
WP_USER=user
WP_USER_PASSWORD=user_password
WP_USER_EMAIL=user@example.com
# Domain
DOMAIN_NAME=apommier.42.fr
2. Hosts file (pour les tests locaux)
echo "127.0.0.1 apommier.42.fr" >> /etc/hosts
Déploiement
Commandes Make
# Déploiement complet
make
# Démarrage en arrière-plan
make back
# Arrêt des services
make down
# Nettoyage complet
make fclean
# Redémarrage complet
make re
Accès aux services
- WordPress : https://apommier.42.fr
- Interface d'admin : https://apommier.42.fr/wp-admin
Configuration des conteneurs
Nginx Dockerfile
FROM alpine:3.16
RUN apk update && apk upgrade && \
apk add --no-cache nginx openssl
# Génération certificats SSL
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx.key \
-out /etc/ssl/certs/nginx.crt \
-subj "/C=FR/ST=IDF/L=Paris/O=42/OU=42/CN=apommier.42.fr"
COPY conf/nginx.conf /etc/nginx/nginx.conf
EXPOSE 443
CMD ["nginx", "-g", "daemon off;"]
WordPress Dockerfile
FROM alpine:3.16
RUN apk update && apk upgrade && \
apk add --no-cache \
php8 php8-fpm php8-mysqli php8-json php8-curl \
php8-dom php8-exif php8-fileinfo php8-mbstring \
php8-openssl php8-xml php8-zip wget
WORKDIR /var/www/html
# Installation WP-CLI
RUN wget https://raw.githubusercontent.com/wp-cli/wp-cli/release/wp-cli.phar && \
chmod +x wp-cli.phar && \
mv wp-cli.phar /usr/local/bin/wp
COPY conf/setup.sh /usr/local/bin/
COPY conf/www.conf /etc/php8/php-fpm.d/
EXPOSE 9000
CMD ["sh", "/usr/local/bin/setup.sh"]
MariaDB Dockerfile
FROM alpine:3.16
RUN apk update && apk upgrade && \
apk add --no-cache mariadb mariadb-client
RUN mysql_install_db --user=mysql --datadir=/var/lib/mysql
COPY conf/setup.sh /usr/local/bin/
COPY conf/mariadb-server.cnf /etc/my.cnf.d/
EXPOSE 3306
CMD ["sh", "/usr/local/bin/setup.sh"]
Volumes et persistance
Configuration des volumes
volumes:
wp_files:
driver: local
driver_opts:
type: none
o: bind
device: /home/apommier/data/wordpress
db_files:
driver: local
driver_opts:
type: none
o: bind
device: /home/apommier/data/mariadb
Répertoires de données
/home/apommier/data/wordpress: Fichiers WordPress/home/apommier/data/mariadb: Base de données MariaDB
Réseau et sécurité
Configuration réseau
networks:
wpnetwork:
driver: bridge
Sécurité implémentée
- HTTPS uniquement (pas de HTTP)
- Certificats TLS v1.2/v1.3
- Isolation des conteneurs
- Variables d'environnement sécurisées
- Utilisateurs non-root dans les conteneurs
- Ports exposés minimaux
Headers de sécurité Nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self'" always;
Scripts d'automatisation
Setup WordPress
#!/bin/sh
# Téléchargement WordPress
wp core download --allow-root
# Configuration base de données
wp config create \
--dbname=$DB_NAME \
--dbuser=$DB_USER \
--dbpass=$DB_PASSWORD \
--dbhost=mariadb:3306 \
--allow-root
# Installation WordPress
wp core install \
--url=$DOMAIN_NAME \
--title="$WP_TITLE" \
--admin_user=$WP_ADMIN_USER \
--admin_password=$WP_ADMIN_PASSWORD \
--admin_email=$WP_ADMIN_EMAIL \
--allow-root
# Création utilisateur supplémentaire
wp user create $WP_USER $WP_USER_EMAIL \
--user_pass=$WP_USER_PASSWORD \
--role=author \
--allow-root
# Démarrage PHP-FPM
php-fpm8 --nodaemonize
Monitoring et logs
Surveillance des conteneurs
# État des conteneurs
docker ps
# Logs en temps réel
docker-compose -f srcs/docker-compose.yml logs -f
# Utilisation des ressources
docker stats
# Inspection des volumes
docker volume ls
docker volume inspect inception_wp_files
Logs des services
# Logs Nginx
docker exec nginx tail -f /var/log/nginx/access.log
docker exec nginx tail -f /var/log/nginx/error.log
# Logs WordPress/PHP
docker exec wordpress tail -f /var/log/php8/error.log
# Logs MariaDB
docker exec mariadb tail -f /var/log/mysql/error.log
Troubleshooting
Problèmes courants
Connexion base de données
# Test connexion MariaDB
docker exec -it mariadb mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME
# Vérifier les variables d'environnement
docker exec wordpress env | grep DB_
Problèmes SSL
# Vérifier certificats
docker exec nginx openssl x509 -in /etc/ssl/certs/nginx.crt -text -noout
# Test connexion HTTPS
curl -k https://apommier.42.fr
Permissions volumes
# Vérifier propriétaire des volumes
ls -la /home/apommier/data/
# Corriger permissions si nécessaire
sudo chown -R $USER:$USER /home/apommier/data/
Performance et optimisation
Optimisations PHP
; Configuration PHP optimisée
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64M
Optimisations MariaDB
[mysqld]
innodb_buffer_pool_size = 256M
query_cache_type = 1
query_cache_size = 64M
max_connections = 100
Optimisations Nginx
worker_processes auto;
worker_connections 1024;
gzip on;
gzip_vary on;
gzip_min_length 1024;
Compétences développées
- Containerisation avec Docker avancé
- Orchestration de services avec Docker Compose
- Administration système Linux
- Sécurité web et infrastructures
- Automatisation et scripting
- Debugging d'environnements complexes
- Performance et optimisation
- Infrastructure as Code
Contraintes et spécifications 42
Contraintes obligatoires
- Images Alpine Linux uniquement
- Dockerfiles personnalisés (pas d'images pré-construites)
- HTTPS uniquement (port 443)
- Volumes persistants obligatoires
- Variables d'environnement pour la configuration
- Restart automatique des conteneurs
Interdictions
- ❌ Images Docker Hub toutes faites
- ❌ Docker images avec tags "latest"
- ❌ Boucles infinites dans les scripts
- ❌ Mots de passe en dur dans les Dockerfiles
- ❌ HTTP non sécurisé
Extensions possibles
Bonus recommandés
- Redis cache pour WordPress
- FTP serveur pour uploads
- Adminer interface base de données
- Monitoring avec Prometheus/Grafana
- Backup automatisé des données
Améliorations avancées
- Multi-stage builds pour optimiser les images
- Health checks pour les services
- Load balancing avec plusieurs instances WordPress
- CI/CD avec GitLab/GitHub Actions
Tests et validation
Tests de fonctionnement
# Test complet du déploiement
make fclean && make
# Vérification HTTPS
curl -k -I https://apommier.42.fr
# Test base de données
docker exec mariadb mysql -u$DB_USER -p$DB_PASSWORD -e "SHOW DATABASES;"
# Performance test
ab -n 100 -c 10 https://apommier.42.fr/
Checklist de validation
- ✅ Tous les conteneurs démarrent sans erreur
- ✅ WordPress accessible en HTTPS
- ✅ Interface admin fonctionnelle
- ✅ Base de données persistante
- ✅ Volumes correctement montés
- ✅ Certificats SSL valides
- ✅ Pas de mots de passe en dur
Auteur
Alexandre Pommier (apommier) - École 42
Licence
Projet académique - École 42
"Infrastructure moderne avec Docker" 🐳🚀