Serveur Web avec Docker : Nginx, PHP et PostgreSQL
Utiliser Docker pour mettre en place un serveur Web intégrant une base de données PostgreSQL, PHP-FPM et servi par Nginx.
Un serveur Web incluant généralement un logiciel serveur (Nginx), un interpréteur de script CGI (PHP) et d’un système de gestion de base de données (PostgreSQL), nous allons voir comment mettre en place ces trois composants en utilisant Docker.
Nginx et PHP FPM
Récemment, j’expliquais comment simplement mettre en place un serveur Nginx qui supporte PHP à l’aide de Docker. L’image php:fpm-alpine
utilisée y était minimaliste et n’embarquait que très peu d’extension PHP. De plus, aucune base de données n’était présente dans notre infra : c’est ce point là que nous allons corrigé ici.
Pour rappel, nous avions créé l’arborescence suivante dans laquelle nous retrouvons le fichier de configuration nginx.conf
, les journaux Nginx et le contenu du site Web dans www
:
|
|
|
|
|
|
Après avoir vérifié que nos deux containers web-nginx
et web-php
sont bien démarrés et que le serveur Nginx est accessible depuis un navigateur Web, nous allons modifier le fichier index.php
pour qu’il se connecte à la base de données et affiche la version du SGBD (Système de Gestion de Base de Données, NDLR).
|
|
Si tous ce passe bien, vous devriez obtenir une erreur … wait, what?
Personnaliser l’image Docker de PHP
Le serveur nous indique qu’il y a une erreur : Call to undefined function pg_connect()
. En effet, l’image Docker standard de PHP n’embarque que très peu de module. Il est précisé sur la page DockerHub PHP comment ajouter des extensions PHP supplémentaires. Nous allons donc créer notre propre image Docker de PHP pour y intégrer le client PostgreSQL.
Commençons par créer un fichier Dockerfile
dans le répertoire docker-web/.build-php
(vous pouvez le placer ailleurs). C’est dans ce fichiers que nous allons décrire comment construire l’image :
- Nous partons de l’image
php:fpm-alpine
- Nous y ajoutons les paquets
postgresql-dev
afin de disposer des bibliothèques nécessaire aux extensions PHP PostgreSQL - L’image
php:fpm-alpine
embarque des scripts pour faciliter l’ajout d’extension, nous les utilisons pour ajouterpgsql
etpdo_pgsql
.
|
|
Il faut également modifier le fichier docker-compose.yml
pour préciser que nous voulons utiliser notre image plutôt que php:fpm-alpine
. Nous renseignons pour cela la directive build
afin d’indiquer à Docker Compose de construire l’image si nécessaire (premier démarrage, modification du fichier Dockerfile
, etc…), ou d’utiliser la dernière image construite si aucune modification n’a été opérée depuis le dernier build.
|
|
host:~# docker-compose up -d
Si tous ce passe bien, vous devriez obtenir une erreur … wait, again?
Le container PostgreSQL
Évidement, il nous manque le container PostgreSQL, que nous avons déjà nommé ci-dessus dans le fichier index.php
: web-pgsql.
host:~# mkdir -p docker-web/data # Pour stocker le contenu de la base de données
Pas besoin de faire compliqué ici, nous allons simplement utiliser l’image officielle et Docker Compose pour configurer et démarrer le container PostgreSQL :
- Le container est nommé
web-pgsql
; - Le répertoire
./docker-web/data
est monté pour y stocker le contenu de la base de données ; - Les variables d’environnement suivantes sont définies :
POSTGRES_PASSWORD
, cette variable définit le mot de passe de l’utilisateurPOSTGRES_USER
pour PostgreSQL ;POSTGRES_USER
, cette variable créera l’utilisateurfoobar
. S’il n’est pas spécifié, l’utilisateur par défaut depostgres
sera utilisé ;POSTGRES_DB
, cette variable créera la base de donnéesfoobar
. S’il n’est pas spécifié,la valeur dePOSTGRES_USER
sera utilisée.
foobar:foobar
pour me connecter à la base de données. Pensez à remplacer les variable d’environnement par vos propres valeurs ;)
|
|
host:~# docker-compose up -d
Si tous ce passe bien, vous devriez obtenir une erreur … Ah non, pas cette fois-ci, maintenant que tout est en place la fonction pg_version()
renvoie les infos des versions client/serveur de PostgreSQL.
Share this post
Twitter
Google+
Facebook
Reddit
LinkedIn
StumbleUpon
Pinterest
Email