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.