Utiliser des conteneurs pour le développement PHP
Prérequis
Terminez Conteneuriser une application PHP.
Aperçu
Dans cette section, vous apprendrez à mettre en place un environnement de développement pour votre application conteneurisée. Cela inclut :
- L'ajout d'une base de données locale et la persistance des données
- L'ajout de phpMyAdmin pour interagir avec la base de données
- La configuration de Compose pour mettre à jour automatiquement vos services Compose en cours d'exécution au fur et à mesure que vous modifiez et enregistrez votre code
- La création d'un conteneur de développement contenant les dépendances de développement
Ajouter une base de données locale et persister les données
Vous pouvez utiliser des conteneurs pour mettre en place des services locaux, comme une base de données. Pour ce faire pour l'application exemple, vous devrez effectuer les opérations suivantes :
- Mettre à jour le
Dockerfile
pour installer les extensions permettant de se connecter à la base de données - Mettre à jour le fichier
compose.yaml
pour ajouter un service de base de données et un volume pour persister les données
Mettre à jour le Dockerfile pour installer les extensions
Pour installer les extensions PHP, vous devez mettre à jour le Dockerfile
. Ouvrez votre
Dockerfile dans un EDI ou un éditeur de texte, puis mettez à jour le contenu. Le
Dockerfile
suivant inclut une nouvelle ligne qui installe les extensions pdo
et pdo_mysql
.
Tous les commentaires ont été supprimés.
# syntax=docker/dockerfile:1
FROM composer:lts as deps
WORKDIR /app
RUN --mount=type=bind,source=composer.json,target=composer.json \
--mount=type=bind,source=composer.lock,target=composer.lock \
--mount=type=cache,target=/tmp/cache \
composer install --no-dev --no-interaction
FROM php:8.2-apache as final
RUN docker-php-ext-install pdo pdo_mysql
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY --from=deps app/vendor/ /var/www/html/vendor
COPY ./src /var/www/html
USER www-data
Pour plus de détails sur l'installation des extensions PHP, consultez l'Image Docker officielle pour PHP.
Mettre à jour le fichier compose.yaml pour ajouter une base de données et persister les données
Ouvrez le fichier compose.yaml
dans un EDI ou un éditeur de texte. Vous remarquerez qu'il
contient déjà des instructions commentées pour une base de données PostgreSQL et un volume. Pour cette application, vous utiliserez MariaDB. Pour plus de détails sur MariaDB, consultez l'Image Docker officielle de MariaDB.
Ouvrez le fichier src/database.php
dans un EDI ou un éditeur de texte. Vous remarquerez qu'il lit les variables d'environnement pour se connecter à la base de données.
Dans le fichier compose.yaml
, vous devrez mettre à jour ce qui suit :
- Décommentez et mettez à jour les instructions de la base de données pour MariaDB.
- Ajoutez un secret au service serveur pour passer le mot de passe de la base de données.
- Ajoutez les variables d'environnement de connexion à la base de données au service serveur.
- Décommentez les instructions de volume pour persister les données.
Voici le fichier compose.yaml
mis à jour. Tous les commentaires ont été supprimés.
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
NotePour en savoir plus sur les instructions du fichier Compose, consultez la référence du fichier Compose.
Avant d'exécuter l'application à l'aide de Compose, notez que ce fichier Compose utilise des
secrets
et spécifie un fichier password.txt
pour contenir le mot de passe de la base de données.
Vous devez créer ce fichier car il n'est pas inclus dans le dépôt source.
Dans le répertoire docker-php-sample
, créez un nouveau répertoire nommé db
et
à l'intérieur de ce répertoire, créez un fichier nommé password.txt
. Ouvrez password.txt
dans un EDI ou un éditeur de texte et ajoutez le mot de passe suivant. Le mot de passe doit être sur une seule ligne, sans lignes supplémentaires dans le fichier.
example
Enregistrez et fermez le fichier password.txt
.
Vous devriez maintenant avoir ce qui suit dans votre répertoire docker-php-sample
.
├── docker-php-sample/
│ ├── .git/
│ ├── db/
│ │ └── password.txt
│ ├── src/
│ ├── tests/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── compose.yaml
│ ├── composer.json
│ ├── composer.lock
│ ├── Dockerfile
│ ├── README.Docker.md
│ └── README.md
Exécutez la commande suivante pour démarrer votre application.
$ docker compose up --build
Ouvrez un navigateur et affichez l'application à l'adresse http://localhost:9000/database.php. Vous devriez voir une application web simple avec du texte et un compteur qui s'incrémente à chaque rafraîchissement.
Appuyez sur ctrl+c
dans le terminal pour arrêter votre application.
Vérifier que les données persistent dans la base de données
Dans le terminal, exécutez docker compose rm
pour supprimer vos conteneurs, puis exécutez docker compose up
pour relancer votre application.
$ docker compose rm
$ docker compose up --build
Rafraîchissez http://localhost:9000/database.php dans votre navigateur et vérifiez que le décompte précédent existe toujours. Sans volume, les données de la base de données ne persisteraient pas après la suppression du conteneur.
Appuyez sur ctrl+c
dans le terminal pour arrêter votre application.
Ajouter phpMyAdmin pour interagir avec la base de données
Vous pouvez facilement ajouter des services à votre pile d'applications en mettant à jour le fichier compose.yaml
.
Mettez à jour votre compose.yaml
pour ajouter un nouveau service pour phpMyAdmin. Pour plus de détails, consultez l'Image Docker officielle de phpMyAdmin. Voici le fichier compose.yaml
mis à jour.
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
depends_on:
- db
environment:
- PMA_HOST=db
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
Dans le terminal, exécutez docker compose up
pour relancer votre application.
$ docker compose up --build
Open http://localhost:8080 in your browser to access phpMyAdmin. Log in using root
as the username and example
as the password. You can now interact with the database through phpMyAdmin.
Press ctrl+c
in the terminal to stop your application.
Automatically update services
Use Compose Watch to automatically update your running Compose services as you edit and save your code. For more details about Compose Watch, see Use Compose Watch.
Open your compose.yaml
file in an IDE or text editor and then add the Compose Watch instructions. The following is the updated compose.yaml
file.
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
develop:
watch:
- action: sync
path: ./src
target: /var/www/html
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
depends_on:
- db
environment:
- PMA_HOST=db
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
Run the following command to run your application with Compose Watch.
$ docker compose watch
Open a browser and verify that the application is running at http://localhost:9000/hello.php.
Any changes to the application's source files on your local machine will now be immediately reflected in the running container.
Open hello.php
in an IDE or text editor and update the string Hello, world!
to Hello, Docker!
.
Save the changes to hello.php
and then wait a few seconds for the application to sync. Refresh http://localhost:9000/hello.php in your browser and verify that the updated text appears.
Press ctrl+c
in the terminal to stop Compose Watch. Run docker compose down
in the terminal to stop the application.
Create a development container
At this point, when you run your containerized application, Composer isn't installing the dev dependencies. While this small image is good for production, it lacks the tools and dependencies you may need when developing and it doesn't include the tests
directory. You can use multi-stage builds to build stages for both development and production in the same Dockerfile. For more details, see
Multi-stage builds.
In the Dockerfile
, you'll need to update the following:
- Split the
deps
staged into two stages. One stage for production (prod-deps
) and one stage (dev-deps
) to install development dependencies. - Create a common
base
stage. - Create a new
development
stage for development. - Update the
final
stage to copy dependencies from the newprod-deps
stage.
The following is the Dockerfile
before and after the changes.
FROM composer:lts as deps
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative
FROM php:8.2-apache as final
WORKDIR /var/www/html
RUN rm -rf /var/www/html/*
COPY --from=deps /app/src /var/www/html
EXPOSE 80
Summary
In this section, you learned how to use multi-stage builds and Compose Watch to enhance your development experience. Multi-stage builds let you create different images for different environments from a single Dockerfile. And, Compose Watch lets you automatically update your services as you edit and save your code.
Related information:
Next steps
In the next section, you'll learn how to run tests with Docker Compose.