Aller au contenu principal

Docker init supporte maintenant PHP

Containerisez votre application PHP rapidement ! Ce guide vous montre comment utiliser la nouvelle fonctionnalité docker init avec PHP et Apache, avec une explication des fichiers Dockerfile et compose.yaml générés.

· 5 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Docker init supporte maintenant PHP

⚡
TL;DR

Cet article teste le nouveau template PHP+Apache de docker init livré avec Docker Desktop 4.26, qui génère un Dockerfile, un compose.yaml et un .dockerignore via un assistant interactif. On y voit un bug de cette première version (l'instruction COPY n'avait pas son chemin source) et pourquoi .dockerignore empêche la plupart des fichiers locaux de se retrouver dans l'image construite.

Quelle heureuse et étrange coïncidence. Dans sa nouvelle version (4.26) sortie hier (le jour de mon anniversaire), Docker ajoute le support de PHP avec Apache à son instruction docker init. Voyons ce que ça donne dans un cas pratique.

L'article officiel : https://www.docker.com/blog/docker-desktop-4-26/

Attention

On va essayer mais, spoiler, c'est encore très jeune.

Démarrez un shell Linux et lancez mkdir -p /tmp/docker-init && cd $_ pour créer un dossier docker-init dans votre dossier temporaire Linux et vous y placer.

Maintenant, dans votre console, lancez simplement docker init et suivez l'assistant.

>user@machine: ~/yourproject

Veillez à sélectionner PHP with Apache - suitable for a PHP web application.

Pour les questions suivantes :

  • What version of PHP do you want to use?, entrez par exemple 8.2,
  • What's the relative directory for your app?, appuyez simplement sur Entrée pour sélectionner le dossier courant,
  • What local port do you want to use to access your server?, appuyez sur Entrée pour utiliser le port proposé ou entrez par exemple 8080.
>user@machine: ~/yourproject

L'assistant est plutôt direct et, au final, on obtient quatre fichiers.

Deux sont vraiment importants pour l'instant : compose.yaml et Dockerfile.

compose.yaml​

En ouvrant compose.yaml avec Visual Studio Code, vous verrez beaucoup de commentaires.

Par défaut, tout est commenté sauf :

Vos valeurs pour cette page
défaut
S'applique aux commandes de cette pageEnregistré uniquement sur cet appareil
services:
server:
build:
context: .
ports:
- 8080:80

Ce fichier Docker Compose définit un service appelé 'server' qui construit une image Docker à partir du répertoire courant et expose le port 8080 de la machine hôte sur le port 80 du conteneur.

Ok, ça veut simplement dire qu'on n'utilisera pas une image Docker standard, déjà existante, mais qu'on va construire la vôtre et que la définition de cette image se trouve dans le dossier courant (context: .). La définition de votre image Docker doit être écrite dans le fichier standard Dockerfile.

La deuxième chose qu'on voit ici, c'est le numéro de port choisi. Le container Docker sera publié sur le port 8080.

Dockerfile​

Ici aussi, docker init a créé un fichier avec beaucoup de commentaires. Si on les retire, voici les lignes non commentées :

FROM php:8.2-apache
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY . /var/www/html
USER www-data

Ce Dockerfile construit une image Docker basée sur PHP 8.2 avec Apache, configure PHP pour la production, copie les fichiers de l'application dans le répertoire web, et change l'utilisateur pour exécuter les processus sous www-data au lieu de root pour des raisons de sécurité.

Bug dans Docker 4.26 - Docker init - PHP + Apache

Il y a un bug dans la release 4.26 : l'instruction COPY doit être COPY . /var/www/html (autrement dit, il faut préciser le dossier source .). J'ai créé une issue sur le repository Docker (https://github.com/docker/cli/issues/4702)

Mettez à jour le fichier Dockerfile et remplacez la ligne COPY /var/www/html par COPY . /var/www/html

On voit donc qu'on va utiliser l'image php:8.2-apache (puisqu'on a demandé PHP 8.2), qu'on va copier le contenu de votre dossier courant (.) vers le dossier /var/www/html dans l'image Docker, qu'on va aussi utiliser le fichier php.ini de production (voyez Mettre à jour php.ini quand on utilise une image Docker si vous devez l'ajuster) et qu'on va basculer l'utilisateur Linux courant dans le container vers www-data.

Lancer le container​

Ok, rien de bien compliqué jusqu'ici. On va créer l'image en lançant docker compose up --build.

Une fois construite, on peut surfer sur http://localhost:8080 et ... aïe.

http://localhost:8080

Forbidden

Et c'est tout à fait normal. Rappelez-vous, votre dossier courant ne contient pour l'instant que les quatre fichiers créés par docker init.

Créez le fichier index.php avec ce contenu :

<?php
phpinfo();

Ce fichier PHP simple appelle phpinfo() pour afficher des informations détaillées sur la configuration PHP installée sur le serveur, notamment les modules chargés, les paramètres de configuration et les variables d'environnement.

Retournez dans votre console, appuyez sur CTRL-C pour arrêter le premier container et lancez cette fois docker compose up --detach --build (comme ça la console ne sera pas bloquée et le container tournera en arrière-plan).

http://localhost:8080

phpinfo

Entrer dans le container​

On va démarrer un shell interactif dans le container. Il suffit de savoir comment le container est nommé.

Retour au fichier compose.yaml : on y retrouve le nom du container ; c'est le nom du service, server dans ce cas.

services:
# highlight-next-line
server:
[...]

Ce fichier YAML définit la configuration des services Docker Compose. Il déclare un service appelé « server » dont les détails de configuration sont abrégés par des points de suspension, ce qui indique que les propriétés complètes du service sont définies ailleurs ou omises pour la lisibilité.

Pour lancer un shell interactif, exécutez la commande suivante :

>user@machine: ~/yourproject

Comme prévu, vous êtes maintenant dans le container. Vous pouvez afficher la liste des fichiers en lançant ls -alh

>user@machine: ~/yourproject

Donc, même si votre dossier courant, sur votre machine, contient maintenant cinq fichiers, seuls README.Docker.md et index.php sont présents. Pourquoi pas les autres ?

.dockerignore​

Sur votre machine, on a donc cinq fichiers :

>user@machine: ~/yourproject

Et seuls README.Docker.md et index.php ont été copiés dans le container.

La raison : les autres fichiers ont été ignorés parce qu'ils sont mentionnés dans le fichier .dockerignore.

# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/
**/.classpath
//highlight-next-line
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/.next
**/.cache
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/charts
**/docker-compose*
//highlight-next-line
**/compose*
!**/composer.json
!**/composer.lock
//highlight-next-line
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
**/vendor
LICENSE
README.md

Ce fichier .dockerignore spécifie les fichiers et répertoires à exclure lors de la construction d'une image Docker, réduisant ainsi la taille du contexte de build. Il ignore les artefacts locaux, les fichiers de configuration d'IDE, les dépendances installées et autres fichiers non essentiels, tout en préservant explicitement les fichiers composer.json et composer.lock nécessaires aux dépendances PHP.

Nous voilà à la fin de cet article. On a utilisé l'instruction docker init pour créer le strict minimum nécessaire à l'exécution d'un script PHP dans un container Apache.

Si tout ce que vous voulez, c'est lancer un script rapidement, sans aucun fichier généré, La façon la plus simple de lancer un script / site PHP tient en une seule ligne.

Dans les prochains mois, je garderai un œil sur l'évolution de docker init du côté de PHP.


Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?