====== 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