Docker LEMP · 7 min read · Sep 24, 2025
Dockeriser la pile LEMP avec Docker-Compose sur Ubuntu
Docker-Compose est un outil en ligne de commande pour définir et gérer des applications docker multi-conteneurs. Compose est un script python, il peut être installé facilement avec la commande pip (pip est la commande pour installer des logiciels Python à partir du dépôt de paquets python). Avec compose, nous pouvons exécuter plusieurs conteneurs docker avec une seule commande. Cela vous permet de créer un conteneur en tant que service, idéal pour votre environnement de développement, de test et de mise en scène.
Dans ce tutoriel, je vais vous guider étape par étape pour utiliser docker-compose afin de créer un environnement de pile LEMP (LEMP = Linux - Nginx - MySQL - PHP). Nous exécuterons tous les composants dans différents conteneurs Docker, nous mettrons en place un conteneur Nginx, un conteneur PHP, un conteneur PHPMyAdmin et un conteneur MySQL/MariaDB.
Prérequis
- Serveur Ubuntu 16.04 -64 bits
- Privilèges root
Étape 1 - Installer Docker
Dans cette étape, nous allons installer Docker. Docker est disponible dans le dépôt Ubuntu, il suffit de mettre à jour votre dépôt et ensuite de l’installer.
Mettre à jour le dépôt ubuntu et mettre à niveau :
sudo apt-get update
sudo apt-get upgradeInstaller la dernière version de Docker à partir du dépôt ubuntu.
sudo apt-get install -y docker.ioDémarrer docker et l’activer pour qu’il démarre au démarrage :
systemctl start docker
systemctl enable dockerLes services Docker sont en cours d’exécution.
Ensuite, vous pouvez essayer d’utiliser docker avec la commande ci-dessous pour le tester :
docker run hello-worldBonjour le monde depuis docker.

Étape 2 - Installer Docker-Compose
Dans la première étape, nous avons déjà installé Docker. Maintenant, nous allons installer docker-compose.
Nous avons besoin de python-pip pour l’installation de compose, installez python et python-pip avec apt :
sudo apt-get install -y python python-pipLorsque l’installation est terminée, installez docker-compose avec la commande pip.
pip install docker-composeMaintenant, vérifiez la version de docker-compose :
docker-compose --versionDocker-compose a été installé.
Étape 3 - Créer et configurer l’environnement Docker
Dans cette étape, nous allons construire notre environnement docker-compose. Nous allons utiliser un utilisateur non-root, donc nous devons créer cet utilisateur maintenant.
Ajoutez un nouvel utilisateur nommé ‘hakase‘ (choisissez votre propre nom d’utilisateur ici si vous le souhaitez) :
useradd -m -s /bin/bash hakase
passwd hakaseEnsuite, ajoutez le nouvel utilisateur au groupe ‘docker‘ et redémarrez docker.
usermod -a -G docker hakase
sudo systemctl restart dockerMaintenant, l’utilisateur ‘hakase‘ peut utiliser docker sans sudo.
Ensuite, depuis l’utilisateur root, connectez-vous à l’utilisateur ‘hakase’ avec su.
su - hakaseCréez un nouveau répertoire pour l’environnement compose.
mkdir lemp-compose/
cd lemp-compose/Ceci est notre environnement docker-compose, tous les fichiers qui doivent être dans le conteneur Docker doivent être dans ce répertoire. Lorsque nous utilisons docker-compose, nous avons besoin d’un fichier .yml nommé ‘docker-compose.yml‘.
Dans le répertoire ‘lemp-compose’, créez quelques nouveaux répertoires et un fichier docker-compose.yml :
touch docker-compose.yml
mkdir -p {logs,nginx,public,db-data}- logs : Répertoire pour les fichiers journaux Nginx.
- nginx : contient la configuration Nginx comme l’hôte virtuel, etc.
- public : répertoire pour les fichiers web, index.html et fichier d’informations PHP.
- db-data : volume du répertoire de données MariaDB.
Créez les fichiers journaux error.log et access.log dans le répertoire ‘logs‘.
touch logs/{error,access}.logCréez un nouveau fichier de configuration d’hôte virtuel nginx dans le répertoire ‘nginx‘ :
vim nginx/app.confCollez la configuration ci-dessous :
upstream php {
server phpfpm:9000;
}
server {
server_name 193.70.36.50;
error_log "/opt/bitnami/nginx/logs/myapp-error.log";
access_log "/opt/bitnami/nginx/logs/myapp-access.log";
root /myapps;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}Enregistrez le fichier et quittez vim.
Créez un nouveau fichier index.html et un fichier d’informations PHP dans le répertoire ‘public‘.
echo 'LEMP Docker-Compose
hakase-labs' > public/index.html
echo '' > public/info.php
Maintenant, vous pouvez voir le répertoire de l’environnement comme indiqué ci-dessous :
tree
Étape 4 - Configuration du fichier docker-compose.yml
Dans l’étape précédente, nous avons créé les répertoires et fichiers nécessaires pour nos conteneurs. Dans cette étape, nous voulons éditer le fichier ‘docker-compose.yml‘. Dans le fichier docker-compose.yml, nous allons définir nos services pour la pile LEMP, les images de base pour chaque conteneur et les volumes docker.
Connectez-vous à l’utilisateur ‘hakase‘ et éditez le fichier docker-compose.yml avec vim :
su - hakase
cd lemp-compose/
vim docker-compose.yml- Définir les services Nginx
Collez la configuration nginx ci-dessous :
nginx:
image: 'bitnami/nginx'
ports:
- '80:80'
links:
- phpfpm
volumes:
- ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log
- ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log
- ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf
- ./public:/myappsDans cette configuration, nous avons déjà défini :
- nginx : nom des services
- image : nous utilisons les images docker ‘bitnami/nginx‘
- ports : expose le port conteneur 80 au port hôte 80
- links : lie le conteneur de service ‘nginx‘ au conteneur ‘phpfpm‘
- volumes : monte des répertoires locaux dans le conteneur. Monte le répertoire des fichiers journaux, monte la configuration de l’hôte virtuel Nginx et monte le répertoire racine web.
- Définir les services PHP-fpm
Collez la configuration ci-dessous sous le bloc Nginx :
phpfpm:
image: 'bitnami/php-fpm'
ports:
- '9000:9000'
volumes:
- ./public:/myappsNous avons défini ici :
- phpfpm : définit le nom du service.
- image : définit l’image de base pour le service phpfpm avec l’image ‘bitnami/php-fpm‘.
- ports : Nous exécutons PHP-fpm avec le port TCP 9000 et exposons le port 9000 à l’hôte.
- volumes : monte le répertoire racine web ‘public‘ dans ‘myapps‘ sur le conteneur.
- Définir le service MySQL
Dans le troisième bloc, collez la configuration ci-dessous pour le conteneur de service MariaDB :
mysql:
image: 'mariadb'
ports:
- '3306:3306'
volumes:
- ./db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=hakase-labs123Ici, vous pouvez voir que nous utilisons :
- mysql : comme nom du service.
- image : le conteneur est basé sur les images docker ‘mariadb‘.
- ports : le conteneur de service utilise le port 3306 pour la connexion MySQL, et l’expose à l’hôte sur le port 3306.
- volumes : répertoire db-data mysql
- environment : définit la variable d’environnement ‘MYSQL_ROOT_PASSWORD‘ pour le mot de passe root mysql dans les images docker, exécutée lors de la construction du conteneur.
- Configuration des services PHPMyAdmin
Dans le dernier bloc, collez la configuration ci-dessous :
phpmyadmin:
image: 'phpmyadmin/phpmyadmin'
restart: always
ports:
- '8080:80'
links:
- mysql:mysql
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: hakase-labs123
PMA_HOST: mysqlNous utilisons une image docker ‘phpmyadmin’, mappant le port conteneur 80 à 8080 sur l’hôte, liant le conteneur au conteneur mariadb, définissant le redémarrage toujours et définissant certaines variables d’environnement de l’image docker, y compris le paramètre ‘PMA_HOST‘.
Enregistrez le fichier et quittez vim.
Vous pouvez voir un exemple complet sur github.
Étape 5 - Exécuter Docker-Compose
Maintenant, nous sommes prêts à exécuter docker-compose. Remarque : lorsque vous souhaitez exécuter docker-compose, vous devez être dans le répertoire du projet docker-compose et vous assurer qu’il y a le fichier yml avec la configuration compose.
Exécutez la commande ci-dessous pour démarrer la pile LEMP :
docker-compose up -d-d : exécution en tant que démon ou en arrière-plan
Vous verrez le résultat que les nouveaux conteneurs ont été créés, vérifiez-le avec la commande ci-dessous :
docker-compose ps
Maintenant, nous avons quatre conteneurs exécutant Nginx, PHP-fpm, MariaDB et PHPMyAdmin.
Étape 6 - Test
Vérifiez les ports utilisés par le docker-proxy sur l’hôte.
netstat -plntu
Nous pouvons voir le port 80 pour le conteneur Nginx, le port 3306 pour le conteneur MariaDB, le port 9000 pour le conteneur php-fpm, et le port 8080 pour le conteneur PHPMyAdmin.
Accédez au port 80 depuis le navigateur web, et vous verrez notre fichier index.html.
Assurez-vous que PHP-fpm fonctionne, accédez-y depuis le navigateur web.
http://serverip-address/info.php

Accédez au conteneur MySQL dans le shell MySQL.
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123Maintenant, créez une nouvelle base de données :
create database hakase_db;
exitLe conteneur shell mysql de MariaDB est accessible, et nous avons créé une nouvelle base de données ‘hakase_db‘.

Ensuite, accédez à PHPMyAdmin sur le port 8080 : http://serverip-address:8080/.
Vous verrez la page de connexion PHPMyAdmin, tapez simplement le nom d’utilisateur ‘root‘ et le mot de passe est ‘hakase-labs123‘.

Vous serez automatiquement connecté au conteneur mysql qui a été défini dans la variable d’environnement PMA_HOST.
Cliquez sur ‘Go‘ et vous verrez le tableau de bord phpmyadmin qui est connecté au conteneur ‘mysql‘.

Succès ! La pile LEMP fonctionne sous une configuration docker-compose, composée de quatre conteneurs.
Référence
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.