====== Docker Compose: nginx + PHP + MariaDB ======
Despliegue de una arquitectura multicontenedor compuesta por un servidor web Ngin, un intérprete de PHP y un motor de base de datos MariaDB
===== Imágenes =====
* Imagen Nginx: https://hub.docker.com/_/nginx
* Imagen PHP: https://hub.docker.com/_/php
* Imagen MariaDB: https://hub.docker.com/_/mariadb
* Imagen de Adminer: https://hub.docker.com/_/adminer
La imagen de Adminer no es necesaria, aunque la incluyo por la comodida de tener una aplicación web para gestionar la base de datos y así no depender de tener instalado un cliente de base de datos
===== Ficheros =====
La estructura sería la siguiente:
├── app
├── docker
│ ├── nginx
│ │ ├── site.conf
│ ├── php
│ │ ├── Dockerfile
├── docker-compose.yml
* ''app'': directorio que va a servir nginx.
* ''nginx/site.conf'': configuración del virtual host de nginx.
* ''php/Dockerfile'': Dockerfile para adaptar la imagen de PHP a nuestro gusto.
* ''docker-compose.yml''
==== docker-compose.yml ====
version: '3'
services:
webserver:
image: nginx:alpine
# For different app you can use different names. (eg: )
# container_name: web-server
volumes:
# app source code
- ./app:/usr/share/nginx/html
- ./config/nginx/site.conf:/etc/nginx/conf.d/default.conf
# db data persistence
ports:
- 8080:80
php:
# image: php:fpm-alpine
build: .
volumes:
- ./app:/usr/share/nginx/html
database:
image: mariadb:focal
environment:
- MYSQL_ROOT_PASSWORD=abcd1234.
adminer:
image: adminer
restart: always
ports:
- 8123:8080
==== site.conf ====
Configuración del virtual host de nginx.
server {
listen 80;
index index.php index.html;
server_name localhost;
root /usr/share/nginx/html/;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
El nombre del host que se le pasa a ''fastcgi_pass'' debe coincidir con lo establecido en ''container_name''.
==== Dockerfile ====
En este fichero modificaremos la imagen de base de PHP para adaptarlo a nuestros requisitos:
FROM php:fpm-alpine
# Modificamos UID y GID del usuario www-data para que coincida con el
# del usuario que ejecuta el servidor web en el contenedor con nginx
# Si no fuese Alpine, se podría hacer con `usermod -u www-data`
# Más info:
# https://stackoverflow.com/questions/36824222/how-to-change-the-nginx-process-user-of-the-official-docker-image-nginx
RUN deluser www-data && adduser -DH -h /home/www-data -s /sbin/nologin -u 101 www-data
RUN docker-php-ext-install mysqli pdo_mysql