Apache et PHP-FPM dans des conteneurs séparés
Objectif
Créer 2 conteneurs séparés pour Apache (Httpd) et PHP-FPM.
Préambule
Il est assez simple d'utiliser Apache avec PHP car plusieurs images sont disponibles sur le Docker Hub de PHP, lien vers le Docker Hub.
J'ai souhaité tenter de les séparer en 2 conteneurs différents. J'ai commencé par créer un fichier docker-compose.yml
pour créer 2 conteneurs avec l'image httpd:2.4
d'un côté et php:7.4-fpm-buster
de l'autre ainsi que quelques configurations pour les faire fonctionner ensemble.
Ce fut un échec, Apache n'a jamais su quoi faire avec un fichier PHP. Je me suis donc penché sur le conteneur Apache pour tenter de trouver une solution.
Vous trouverez ma solution dans le tutoriel ci-dessous, bonne lecture.
Tutoriel
Arborescence
Commençons par créer un dossier dans lequel nous allons travailler :
mkdir httpd-phpfpm && cd httpd-phpfpm
Dans ce dossier, nous allons créer les dossiers pour les volumes persistants de notre conteneur Docker :
mkdir -p data conf/httpd
Fichier de configuration du VirtualHost
Dans le fichier conf/httpd
, nous allons créer le fichier 000-default.conf
qui contiendra :
<VirtualHost *:80>
ServerName votre-nom-de-domaine.com
ServerAdmin [email protected]
DocumentRoot /var/www/html
<FilesMatch \.php$>
SetHandler "proxy:fcgi://phpfpm:9000"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Avant d'enregistrer et de fermer le fichier, n'oubliez pas de modifier les 2 valeurs des directives ServerName
et ServerAdmin
.
C'est le bloc ci-dessous qui va permettre à Apache d'interprêter le code PHP d'une page.
<FilesMatch \.php$>
SetHandler "proxy:fcgi://phpfpm:9000"
</FilesMatch>
Fichier PHP
Dans le fichier data
, nous allons créer le fichier index.php
qui contiendra simplement :
<?php phpinfo();
Ce fichier nous permettra de tester le bon fonctionnement entre les 2 conteneurs.
Fichier : httpd.Dockerfile
Httpd sera installé à partir d'une image Debian car l'image httpd:2.4
ne fonctionnera pas avec l'image PHP-FPM. Voici donc le contenu du fichier httpd.Dockerfile
:
FROM debian:buster-slim
RUN apt-get update && apt-get install -y apache2
RUN a2enmod proxy_fcgi
COPY ./conf/httpd/000-default.conf /etc/apache2/sites-available/000-default.conf
CMD /usr/sbin/apache2ctl -D FOREGROUND
Dès que l'image est téléchargée, on installe apache2
et on active le module proxy_fcgi
.
Avant de lancer Apache, on copie le fichier 000-default.conf
que nous avons créé précédemment.
Fichier : docker-compose.yml
A la racine de notre projet (dossier httpd-phpfpm
), nous allons créer un fichier docker-compose.yml
contenant :
version: '3'
services:
httpd:
build:
context: .
dockerfile: httpd.Dockerfile
ports:
- 80:80
volumes:
- ./data:/var/www/html
networks:
- httpdphpfpm
phpfpm:
image: "php:7.4-fpm-buster"
expose:
- 9000
volumes:
- ./data:/var/www/html
networks:
- httpdphpfpm
networks:
httpdphpfpm:
driver: bridge
Build et lancement
Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer les conteneurs :
docker-compose build && docker-compose up -d
Résultat
Vous pouvez visualiser votre page en ouvrant votre navigateur à l'adresse : http://votre-nom-de-domaine.com/