Déployer une première application avec Docker Compose 🚀

Déploie ta première application multi-services avec Docker Compose grâce à un exemple concret NGINX + PHP. Structure ton projet, fais communiquer tes containers et comprends enfin comment Docker Compose fonctionne en pratique 🚀

Schéma illustrant le déploiement d’une application NGINX et PHP avec Docker Compose, montrant les services, le fichier docker-compose.yml et l’exécution d’un script PHP.
Déployer une application NGINX + PHP avec Docker Compose : une stack simple pour comprendre la communication entre containers.

Maintenant que Docker et Docker Compose sont installés, il est temps de passer à quelque chose de concret. Comprendre la théorie, c’est bien. Déployer une vraie application, c’est mieux.

Dans cet article, on va déployer une application très simple mais réaliste : un combo NGINX + PHP, avec un simple fichier index.php. L’objectif n’est pas de construire une usine à gaz, mais de comprendre comment plusieurs services Docker fonctionnent ensemble grâce à Docker Compose.

👉 Si ce n’est pas encore fait, je te conseille de lire d’abord :


Pourquoi NGINX + PHP ?

C’est un cas très courant :

  • NGINX sert les requêtes HTTP
  • PHP-FPM exécute le code PHP
  • Les deux services communiquent entre eux

C’est simple, parlant, et très représentatif d’une stack web classique.


Structure du projet

On commence par organiser proprement le projet :

nginx-php/
├── docker-compose.yml
├── nginx/
│   └── default.conf
└── app/
    └── index.php

Cette structure permet de bien séparer :

  • la configuration NGINX
  • le code applicatif
  • la configuration Docker

Le fichier index.php

Dans le dossier app, crée un fichier index.php :

<?php
echo "Docker Compose fonctionne !";
phpinfo();

Rien de complexe ici. Ce fichier nous permet simplement de vérifier que PHP est bien exécuté via NGINX.


Configuration NGINX

Dans le dossier nginx, crée le fichier default.conf :

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Ici, NGINX ne fait qu’une chose : transmettre les fichiers PHP au service PHP-FPM.


Le docker-compose.yml

C’est le cœur du projet.

version: "3.9"

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  php:
    image: php:8.3-fpm
    container_name: php
    volumes:
      - ./app:/var/www/html

Quelques points importants :

  • NGINX et PHP sont deux services distincts
  • Ils partagent le même volume pour le code
  • depends_on garantit que PHP démarre avant NGINX
  • La communication se fait via le nom du service (php)

Lancer l’application

Depuis la racine du projet :

docker compose up -d

Vérifie que tout tourne :

docker compose ps

Puis ouvre ton navigateur sur :

http://IP_DU_SERVEUR:8080

Si tout est correct, tu devrais voir ton message et la page phpinfo() 🎉


Voir les logs

En cas de problème (ou juste par curiosité), les logs sont très utiles :

docker compose logs -f

Tu verras rapidement si l’erreur vient de NGINX ou de PHP.


Arrêter proprement le projet

Quand tu as terminé :

docker compose down

Les containers sont arrêtés, mais les fichiers restent en place. Tu peux relancer le projet quand tu veux.


Erreurs fréquentes

Quelques pièges classiques :

  • oublier de monter le volume du code
  • se tromper dans le nom du service PHP dans NGINX
  • modifier un container au lieu du fichier docker-compose.yml

👉 rappelle-toi : Docker Compose est la source de vérité.


Conclusion

Avec ce simple projet NGINX + PHP, tu viens de déployer une vraie application multi-services avec Docker Compose. Tu comprends maintenant comment les services communiquent, comment les volumes fonctionnent et comment structurer un projet proprement.

Dans le prochain article, on fera exactement la même chose… mais avec Portainer, pour voir comment gérer cette stack via une interface graphique sans perdre le contrôle 🚀