fermer
Astuce

Comment utiliser Docker pour conteneuriser PHP et Apache ?

Comment utiliser Docker pour conteneuriser PHP et Apache ?

Les conteneurs Docker rendent votre application portable dans tous les environnements. Une fois que vous avez obtenu une image de conteneur, vous pouvez l’utiliser partout où Docker est disponible. Voici comment conteneuriser une application web PHP en utilisant le serveur Apache.

J’utilise l’image Docker officielle de PHP comme base. Des variantes préconfigurées avec Apache sont fournies, de sorte que vous n’aurez pas besoin d’installer le serveur Web vous-même. L’image de base PHP offre également des utilitaires pratiques pour la gestion des extensions PHP.

Création d’un fichier Docker

Les images Docker sont créées à partir d’un Dockerfile. Ce fichier contient des instructions qui sont utilisées pour construire l’image. Les instructions comprennent COPY, pour copier des fichiers et des dossiers dans le conteneur, et RUN, pour exécuter une commande dans le conteneur.

Vous pouvez faire fonctionner un simple site PHP en copiant simplement ses fichiers dans une image basée sur php:8.0-apache.

FROM php:8.0-apache WORKDIR /var/www/html
COPY index.php index.php
COPY src/ src
EXPOSE 80

Ce fichier Dockerfile prend index.php et src dans notre répertoire de travail et les copie dans la racine du document Apache. Vous pouvez maintenant construire l’image et démarrer un conteneur à partir de celle-ci. Vous verrez que votre site est servi par Apache.

docker build -t my-php-site:latest . 
docker run -d -p 80:80 my-php-site:latest

Les images Docker PHP ont la racine du document Apache à l’emplacement par défaut de /var/www/html dans Debian. L’instruction WORKDIR dans le fichier Dockerfile signifie que les commandes suivantes seront exécutées dans la racine du document.

Apache s’expose sur le port par défaut du serveur Web, à savoir 80. La directive EXPOSE du Dockerfile l’indique. En exposant explicitement le port, vous pouvez utiliser l’indicateur -p avec docker run pour lier automatiquement un port hôte aléatoire au port 80 du conteneur.

Personnalisation de la configuration d’Apache

Les images officielles de PHP/Apache sont basées sur Debian. Vous pouvez utiliser le gestionnaire de paquets apt pour ajouter les logiciels supplémentaires dont vous avez besoin. Vous avez également un accès complet aux outils intégrés d’Apache. Vous pouvez utiliser a2enmod/a2dismod pour gérer les modules et a2ensite/a2dissite pour interagir avec les hôtes virtuels.

Le fichier de configuration d’Apache a pour valeur par défaut /etc/apache2/apache2.conf. Ajoutez des lignes à ce fichier, ou remplacez-le entièrement, pour étendre la configuration d’Apache.

Une modification qui vaut toujours la peine d’être effectuée consiste à définir explicitement le nom du serveur Apache. Cela permet d’éviter l’avertissement “unable to reliably determine ServerName” qui apparaît généralement dans les journaux de votre conteneur.

Vous souhaiterez également ajouter votre propre hôte virtuel Apache. Cela vous permet de mettre en place une configuration personnalisée au-delà de ce que fournit le site Apache 000 par défaut. Voici comment effectuer ces modifications.

COPY my-apache-site.conf /etc/apache2/sites-available/my-apache-site.conf
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf &&
   a2enmod rewrite &&
   a2dissite 000-default &&
   a2ensite my-apache-site &&
   service apache2 restart

Cet exemple désactive le site par défaut, active le site personnalisé et redémarre Apache pour appliquer les modifications. Le module mod_rewrite est également activé, ce qui permet d’utiliser les directives Rewrite dans les fichiers .htaccess. Vous pouvez également activer d’autres modules, comme celui des headers si votre configuration doit interagir avec les headers de réponse.

Ajout d’extensions PHP

Les images Docker PHP sont fournies avec des utilitaires de gestion des extensions intégrés. Certaines extensions sont activées par défaut – vous pouvez vérifier ce qui est disponible en exécutant php -m dans un conteneur en cours d’exécution.

La plupart des extensions courantes peuvent être installées en utilisant docker-php-ext-install :

docker-php-ext-install pdo_mysql

Certaines extensions doivent être configurées avant de pouvoir être installées. Vous pouvez utiliser docker-php-ext-configure pour effectuer une configuration pré-installation. Les options disponibles varient selon l’extension.

RUN docker-php-ext-configure gd --with-jpeg=/usr/include/ && docker-php-ext-install gd

Vous pouvez également utiliser les extensions distribuées par PECL. Ces extensions nécessitent une procédure d’installation en deux étapes. Installez d’abord le paquet PECL, puis utilisez docker-php-ext-enable pour enregistrer l’extension avec votre installation PHP.

RUN apt-get install -y libmcached-dev zlib1g-dev &&
    pecl install memcached-3.1.5 &&
    docker-php-ext-enable memcached

Configuration de PHP

Les images Docker sont préconfigurées pour charger les fichiers de configuration PHP trouvés dans /usr/local/etc/php/conf.d. Ajoutez votre propre fichier .ini dans ce répertoire. PHP inclura son contenu au moment de l’exécution, en écrasant toutes les valeurs existantes. C’est la façon recommandée d’étendre la configuration par défaut.

Le chemin du répertoire de configuration peut changer dans le futur. Vous pouvez obtenir son emplacement actuel en utilisant la variable d’environnement $PHP_INI_DIR. Il s’agit actuellement de /usr/local/etc/php/conf.d.

Utilisation de Composer

Composer n’est pas disponible par défaut. Composer est un effort communautaire qui existe indépendamment de PHP. Vous devez l’installer manuellement si vous voulez l’utiliser dans un conteneur Docker.

La meilleure façon d’utiliser Composer dans vos constructions est de référencer l’image Docker de l’outil par une construction en plusieurs étapes. Utilisez COPY --from pour amener le binaire de Composer dans votre conteneur PHP ; vous pouvez ensuite utiliser Composer normalement pour installer les dépendances de votre projet.

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install --no-dev

L’utilisation de cette approche réduit la complexité. Vous n’avez pas besoin de télécharger et d’exécuter le script d’installation de Composer. En faisant référence à composer:2, Docker extrait l’image et copie ensuite le binaire de Composer.

Scripts de point d’entrée personnalisés

Vous devrez peut-être utiliser un script de point d’entrée personnalisé si vous souhaitez exécuter des migrations d’applications avant le démarrage du serveur principal. Vous pouvez remplacer le conteneur ENTRYPOINT pour utiliser votre propre séquence de démarrage.

Vous pouvez faire en sorte que l’exécution du conteneur se poursuive normalement en exécutant apache2-foreground. Ceci exécutera Apache au premier plan, empêchant le conteneur de sortir après la fin du script de point d’entrée.

ENTRYPOINT ["bash", "/Docker.sh"]

Contenu de Docker.sh :

php app.php my-migration-command    # run migrations
service cron start                  # start some services
exec apache2-foreground             # main execution

Conclusion

La mise sous Docker d’un service Web PHP est simple lorsqu’on utilise les images officielles. Vous pouvez facilement configurer Apache et PHP avec des extensions et vos propres fichiers de configuration.

Il est plus probable que vous rencontriez des difficultés lorsque vous essayez d’utiliser des addons communautaires tiers comme Composer. Ceux-ci ne sont pas inclus par défaut, vous devrez donc utiliser des images Docker en plusieurs étapes ou des procédures d’installation manuelles.

L’utilisation de Docker permet à votre application d’être polyvalente quant à la manière et à l’endroit où elle est déployée. Avec votre image, vous pouvez lancer une installation fonctionnelle de votre site en utilisant uniquement docker build et docker run dans votre terminal.

Tags : apacheDockerPHP
Yohann Poiron

The author Yohann Poiron

J’ai fondé le BlogNT en 2010. Autodidacte en matière de développement de sites en PHP, j’ai toujours poussé ma curiosité sur les sujets et les actualités du Web. Je suis actuellement engagé en tant qu’architecte interopérabilité.