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/

Tutoriel publié le 18/11/2020.

Dernière modification: 18 novembre 2020

Auteur