TP N°1 : Déployer un site PHP qui affiche "Connexion BDD OK".

📚Docker pour les débutants : Le Chantier Naval
🔧 Travaux pratiques⏱ 10 min✅ Gratuit

Nous avons maintenant les trois conteneurs de notre stack en fonctionnement :

apache
php
mariadb

Ils sont tous connectés au réseau :

monprojet-network

Dans ce premier TP, nous allons mettre en place un petit site PHP capable de se connecter à la base de données MariaDB et d’afficher simplement :

Connexion BDD OK

L’objectif n’est pas de créer une application complexe, mais de valider que tous les conteneurs communiquent correctement entre eux.

🎯 Objectif du TP

À la fin de cet exercice, vous devrez pouvoir ouvrir votre navigateur sur :

http://localhost:8080

Ou depuis indiquant l’adresse IP du serveur hôte Docker depuis un votre ordinateur si vous avez opté pour une installation “serveur” sans interface graphique

et voir apparaître :

Connexion BDD OK

Si ce message apparaît, cela signifie que :

  • Apache sert correctement les pages web
  • PHP exécute les scripts
  • PHP peut contacter MariaDB
  • le réseau Docker fonctionne correctement

Bref : toute la stack est opérationnelle.

📁 Créer le fichier du site

Dans le dossier app que nous avons créé précédemment, créons un fichier :

app/index.php

Ajoutez le contenu suivant :

<?php

$host = "mariadb";
$db   = "monsite";
$user = "monsiteuser";
$pass = "monsitepassword";

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
    echo "Connexion BDD OK";
} catch (PDOException $e) {
    echo "Erreur de connexion : " . $e->getMessage();
}

Ce script PHP va simplement essayer de se connecter à la base MariaDB.

🔍 Comprendre ce script

La ligne la plus importante est :

$host = "mariadb";

Pourquoi mariadb ?

Parce que dans le réseau Docker monprojet-network, chaque conteneur est accessible par son nom.

Le conteneur PHP peut donc contacter la base de données via :

mariadb

sans connaître son adresse IP.

🌐 Tester l’application

Ouvrez votre navigateur et rendez-vous sur :

http://localhost:8080

Si tout est correctement configuré, vous devriez voir :

Connexion BDD OK

🎉 Félicitations ! Votre première application web multi-conteneurs fonctionne.

🔎 Que se passe-t-il réellement ?

Lorsqu’un utilisateur accède au site :

http://localhost:8080

le flux devient :

Navigateur
   │
   ▼
Apache
   │
   ▼
PHP-FPM
   │
   ▼
MariaDB

1️⃣ Apache reçoit la requête du navigateur
2️⃣ Apache transmet le script .php au conteneur PHP
3️⃣ PHP exécute le script
4️⃣ PHP se connecte à MariaDB
5️⃣ Le message Connexion BDD OK est renvoyé au navigateur

🧪 En cas de problème

Si le message ne s’affiche pas, plusieurs vérifications sont possibles.

Vérifier les conteneurs

docker ps

Les trois conteneurs doivent être en cours d’exécution.

Vérifier les logs Apache

docker logs apache

Vérifier les logs PHP

docker logs php

Vérifier les logs MariaDB

docker logs mariadb

Les logs sont le premier outil de diagnostic lorsqu’un conteneur ne fonctionne pas comme prévu.


📌 À retenir

Dans ce TP, vous avez :

  • déployé un site PHP simple
  • connecté PHP à MariaDB
  • validé la communication entre trois conteneurs
  • testé l’ensemble via un navigateur web

Votre stack Docker fonctionne maintenant pleinement.

Dans la prochaine section, nous allons découvrir Docker Compose, qui permet de décrire toute cette architecture dans un simple fichier YAML, au lieu de lancer plusieurs commandes docker run. 🚀


Réaliser ce TP en ligne, vous avez la possibilité de réalise ces actions directement en ligne en lançant un environnement en cliquant sur le bouton ci-après.

🧪 Lab · membre · 20 min

🧪 Lancer le lab

Consignes :

  • Utiliser le dossier /tp pour stockage les fichiers et la configuration d’Apache sera dans le dossier config
  • Le nom du réseau doit être tp-net
Voir la solutionMasquer la solution

1. Creation du réseau pour la communication des conteneurs

docker network create tp-net

2. Créer le dossier qui va contenir notre application, la configuration Apache2 et les données MariaDB.

mkdir -p /tp/app && mkdir /tp/config && mkdir /tp/data && cd /tp

3. Créer et lancer le conteneur MariaDB

docker run -d \
--name mariadb \
--network tp-net \
-v /tp/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_DATABASE=monsite \
-e MYSQL_USER=monsiteuser \
-e MYSQL_PASSWORD=monsitepassword \
--restart unless-stopped \
mariadb:11

4. Créer et lancer le conteneur PHP

docker run -d \
--name php \
--network tp-net  \
-v /tp/app:/var/www/html \
--restart unless-stopped \
rdrit/php83

5. Créer le fichier de configuration pour Apache

nano config/apache2.conf
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off

ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 combined

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf

AccessFileName .htaccess
<FilesMatch "^\.ht">
	Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf

#DocumentRoot "/var/www/html"
DirectoryIndex index.php index.html

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot "/var/www/html"

    # Protection et passage à PHP-FPM
    <FilesMatch \.php$>
        <IfModule mod_proxy_fcgi.c>
            SetHandler "proxy:fcgi://php:9000"
        </IfModule>
    </FilesMatch>
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1

    # Désactiver le proxy direct pour la sécurité
    ProxyRequests Off

</VirtualHost>

6. Créer et lancer le conteneur Apache

docker run -d \
--name apache \
--network tp-net  \
-p 8080:80 \
-v /tp/app:/var/www/html \
-v /tp/config/apache2.conf:/etc/apache2/apache2.conf \
--restart unless-stopped \
rdrit/apache2

7. Verifier que le conteneur sont démarrés

docker ps

8. Créer le fichier PHP de test :

nano app/index.php
<?php

$host = "mariadb";
$db   = "monsite";
$user = "monsiteuser";
$pass = "monsitepassword";

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
    echo "Connexion BDD OK";
} catch (PDOException $e) {
    echo "Erreur de connexion : " . $e->getMessage();
}

Tester le fonctionnement - comme nous n’avons pas de navigateur, nous allons le faire avec Curl

curl http://dind:8080/index.php