Construire l'image : une base officielle, MySQL ajouté à la main
ServeurPartir de l'image officielle php:8.2-apache de Docker Hub et y ajouter MariaDB, pour obtenir une pile LAMP complète dans une seule image que vous maîtrisez de bout en bout.
Pour mieux comprendre
Un conteneur démarre en exécutant un seul programme : ce que dit le CMD ou le ENTRYPOINT du Dockerfile. Quand ce programme se termine, le conteneur s'arrête. Pour faire cohabiter Apache et MariaDB, le ENTRYPOINT sera un script bash qui lance MariaDB en arrière-plan puis garde Apache en avant-plan (le PID 1). Ce pattern « tout-en-un » est détaillé dans le guide PHP, Apache et MariaDB et son laboratoire Web et données : même recette, application différente.
Indications - le serveur web
- Image de base :
php:8.2-apache, l'image officielle maintenue par l'équipe PHP. - Compléter le Dockerfile : copier
demarrer-services.shdans/usr/local/bin/, le rendre exécutable, le déclarer commeENTRYPOINT. - Exposer le port 80 dans le Dockerfile (
EXPOSE 80) et le « forwarder » au port 8080 avec l'option-p "8080:80"au lancement du conteneur. - Activer la réécriture d'adresses pour les permaliens :
a2enmod rewrite, et autoriser les fichiers.htaccessen passantAllowOverrideàAllpour/var/www/html.
Indications - la base de données
- Installer MariaDB via apt :
apt-get update && apt-get install -y --no-install-recommends mariadb-server mariadb-client. - WordPress parle à sa base avec l'extension
mysqli:docker-php-ext-install mysqli. Cette commande est fournie par les images officielles PHP. - Nettoyer le cache apt après l'installation :
apt-get clean && rm -rf /var/lib/apt/lists/*.
Squelette à compléter :
FROM image-de-base ENV DEBIAN_FRONTEND=noninteractive # Installer MariaDB, l'extension mysqli, activer la réécriture RUN apt-get update \ && apt-get install -y --no-install-recommends paquets \ && docker-php-ext-install extension \ && a2enmod rewrite \ && sed -ri 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Script de démarrage COPY demarrer-services.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/demarrer-services.sh # Préparer le dossier de données MariaDB RUN mkdir -p /var/lib/mysql && chown -R mysql:mysql /var/lib/mysql EXPOSE 80 ENTRYPOINT ["/usr/local/bin/demarrer-services.sh"]
Et le script de démarrage, coeur du pattern tout-en-un :
#!/bin/bash set -e # 1. Démarrer MariaDB en arrière-plan service mariadb start # 2. Attendre que MariaDB réponde until commande-de-ping; do sleep 1 done # 3. Premier démarrage : préparer la base (voir l'étape 02) # 4. Apache en avant-plan = PID 1 du conteneur exec commande-apache
exec devant apache2-foreground, le script bash reste PID 1 et Apache devient son enfant : lors d'un docker stop, le signal d'arrêt n'atteint pas Apache proprement. Avec exec, Apache remplace le script et reçoit les signaux directement.docker build -t boutique-cornucopia:1.0 . et un conteneur lancé avec -p "8080:80" affiche une page (même vide ou une erreur PHP : c'est normal, le site arrive à l'étape 02).Dockerfile
étape 01
Les vraies valeurs de la démonstration en classe (La Table Ronde). Pour votre Cornucopia, reprenez la structure et adaptez les valeurs à votre sauvegarde.
# Démonstration - La Table Ronde sur un seul conteneur FROM php:8.2-apache ENV DEBIAN_FRONTEND=noninteractive # Installer MariaDB, l'extension mysqli, activer la réécriture d'adresses RUN apt-get update \ && apt-get install -y --no-install-recommends mariadb-server mariadb-client \ && docker-php-ext-install mysqli \ && a2enmod rewrite \ && sed -ri 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # PHP de php:8.2-apache ne connaît pas le socket de MariaDB Debian : # sans ces deux lignes, WordPress avec DB_HOST=localhost répond # « Erreur lors de la connexion à la base de données » (piège classique). RUN { \ echo "mysqli.default_socket=/run/mysqld/mysqld.sock"; \ echo "pdo_mysql.default_socket=/run/mysqld/mysqld.sock"; \ } > /usr/local/etc/php/conf.d/socket-mariadb.ini # Script de démarrage : MariaDB en arrière-plan, Apache en avant-plan COPY demarrer-services.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/demarrer-services.sh # Préparer le dossier de données MariaDB RUN mkdir -p /var/lib/mysql && chown -R mysql:mysql /var/lib/mysql EXPOSE 80 ENTRYPOINT ["/usr/local/bin/demarrer-services.sh"]
#!/bin/bash set -e # 1. Démarrer MariaDB en arrière-plan service mariadb start # 2. Attendre que MariaDB réponde until mysqladmin ping --silent; do sleep 1 done # 3. Premier démarrage : préparer la base (viendra à l'étape 02) # 4. Apache en avant-plan = PID 1 du conteneur exec apache2-foreground