Seguimos con la publicación de esta guía, ya desarrollamos una api para gestión de la aplicación ADMIN-APP, ahora también con Laravel vamos a crear el proyecto ORDER-APP para la creación y gestión de pedidos que se comunicará con ADMIN-APP con RabbitMQ.

Como en la publicación 2. Proyecto backend ADMIN-APP con Docker Compose : Laravel, Nginx y MySQ , ya vimos con detalle la creación de un proyecto Laravel con Docker Compose en está publicación vamos ir directos al desarrollo sin entrar en detalles. Si estás empezando puedes ver primero como crear un proyecto Laravel con Docker Compose con MySQL como motor de base de datos y Nginx como servidor de aplicaciones Docker Laravel: configuración e instalación de un proyecto con Laravel:

Índice

EL proyecto lo realizaremos en unas 10 publicaciones apróximadamente, vamos a ver el apartado 4 en esta publicación.

  1. Explicación del proyecto: Creación de una aplicación de microservicios con Laravel y RabbitMQ
  2. Creación del proyecto backend ADMIN-APP con Docker Compose : Laravel, Nginx y MySQL
  3. Desarrollamos la API REST de ADMIN-APP para empresas y clientes
    1. CRUD controller y API controller para las empresas (cm_enterprise) (30/01/2022)
    2. CRUD controller y API controller para los clientes (cm_customer) (7/02/2022)
  4. Creación del proyecto order app con docker frontend pedidos (12/02/2022)
    1. Creación del proyecto Laravel
    2. Contenedor Docker con la definición del Dockerfile para la máquina principal con PHP
    3. Creación del fichero de configuración para el servidor web con Nginx
    4. Configuración con docker-compose de Laravel / Servidor Web / MySQL
  5. RabbitMQ admin y order app , actualización de clientes
  6. Creamos la página de entrada de pedidos
  7. RabbitMQ Automatización y colas diferenciadas
  8. RabbitMQ actualizamos el saldo de clientes en ADMIN-APP desde ORDER-APP
  9. EXTRA: Laravel Api Rest documentación de API con Swagger para ADMIN-APP 
  • Nota: durante las publicaciones este índice podrá sufrir alguna modificación para adaptar el contenido.

Software que utilizaremos

En este listado incluimos todo el software utilizado en todo el proyecto, no solo en esta publicación:

  • Linux (Ubuntu 20.04 LTS): sistema operativo Linux con la versión de Ubuntu 20.04 LTS
  • Docker (docker): Docker version 20.10.7, esta guía se ha generado utilizando esta versión de Docker.
  • Docker compose (docker-compose): docker-compose version 1.25.0, , esta guía se ha generado utilizando esta versión
  • Laravel 8: framewok PHP de desarrollo de aplicaciones web, en este caso utilizaremos la versión 8.
  • Mysql 5.7: versión utilizada en la imagen de docker-compose para la base de datos.
  • Nginx: servidor web de aplicaciones
  • PHP 7.4: utilizamos PHP en una versión superior a 7.4 siguiendo las recomendaciones de Laravel, por eso la imagen que utilicemos será de esta versión.
  • Composer 2: gestor de paquetes a partir de archivos json utilizado por Laravel, utilizamos Composer 2 porque lo necesitamos para Laravel 8, en esta publicación indicamos como actualizarlo.
  • Artisan: programa de línea de comandos de Laravel que nos ayuda en la creación de elementos como modelos, controladores, …, y también, nos proporciona otras utilidades como gestión de las migraciones o el listado de las rutas
  • RabbitMQ / CloudAMQP: en este proyecto utlizaremos CloudAMQP (provides managed RabbitMQ servers in the cloud), que nos proporciona un servidor para RabbitMQ en la nube, y así nos facilita el desarrollo en la nube. Otra opción sería instalar una máquina Docker con RabbitMQ pero eso complicaría el objetivo de este tutorial

4. CREACIÓN DEL PROYECTO ORDER APP CON DOCKER FRONTEND PEDIDOS: Laravel, Nginx y MySQL

En la aplicacíon ORDER APP crearemos una WEB donde se crearán los pedidos está aplicación será desarrollada con el framework PHP Laravel utilizando como base de datos MySQL, como ya hemos comentado utilizaremos contenedores Docker para la gestión y mantenimiento de los proyectos.

Para este proyecto ORDER APP creamos el directorio cx-lpm-customerdb-orders, dentro desde directorio crearemos nuestro proyecto y los contenedores Docker para el soporte del mismo:

mkdir cx-lpm-customerdb-orders

4.1. Creación del proyecto Laravel

Utilizaremos Composer para la creación del proyecto con Laravel, como vamos a usar Laravel 8, es necesario tener actualizado Composer a la versión 2 (dudas en Instalación y actualización de Composer 2 ; dentro de la carpeta cx-lpm-customerdb-orders creamos el proyecto Laravel cx-lpm-customerdb-orders-app:

$composer create-project laravel/laravel <strong><em>cx-lpm-customerdb-orders-app</em></strong>
Creating a "laravel/laravel" project at "./cx-lpm-customerdb-orders-app"
 Installing laravel/laravel (v8.6.10)
 Installing laravel/laravel (v8.6.10): Extracting archive
 Created project in /home/xules/xulprocx-local/DOCKER-Projects/Docker-Laravel/cx-laravel-microservices-customerdb-publish/cx-lpm-customerdb-orders/cx-lpm-customerdb-orders-app 
   @php -r "file_exists('.env') || copy('.env.example', '.env');"
   Loading composer repositories with package information  

Hasta aquí se crean los directorios del proyecto, y posteriormente se descargan todas las librerías de partida para utilizar con el proyecto Laravel.

4.2. Contenedor Docker con la definición del Dockerfile para la máquina principal con PHP

Con una imagen idéntica a la utilizada en la publicación inicial creamos una imagen imagen php con la versión 7.4 para ello utilizamos la imagen disponible: 7.4-fpm

Para una explicación detallada puedes consultar la Creación del Dockerfile de la máquina principal con PHP, la creación de la imagen parte de una imagen PHP en concreto php:7.4-fpm, dentro del fichero incluyo unas explicaciones breves.

El fichero lo creamos dentro de la carpeta del proyecto Laravel, así tendremos está estructura:

IMAGEN DE LA ESTRUCTURA DE FICHEROS.

Abrimos del fichero Dockerfile y copiamos esta máquina:

FROM php:7.4-fpm

# Permitimos el paso de parámetros (argumentos) que se definirán en el fichero docker-compose.yml
ARG user
ARG uid

# Añadimos dependencias y utilidades interesantes al sistema como: git, curl, zip, ...:
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libxml2-dev \
    libonig-dev \
    libpng-dev \
    zip \
    unzip

# Una vez finalizado borramos cache y limpiamos los archivos de instalación
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Instalamos las dependencias y extensiones PHP que necesitaremos en nuestro proyecto como: pdo_mysql o mbstring
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd sockets 
    # Sockets
	# Sockets: probando 07.06.2021
    ## && docker-php-ext-install sockets 

# Instalamos dentro de la imagen la última versión de composer, para ello copiamos la imagen disponible en el repositorio:
COPY --from=composer:2.0.13 /usr/bin/composer /usr/bin/composer

# Copiamos de la última imagen de node en nuestro proyecto las librerías de los módulos y de node
COPY --from=node:latest /usr/local/lib/node_modules /usr/local/lib/node_modules
COPY --from=node:latest /usr/local/bin/node /usr/local/bin/node
# Creamos un enlace virtual para poder utilizar directamente npm dentro de la máquina Docker:
RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
# Instamos npm a posteriori al igual que composer
# RUN npm install

# Creamos un usuario de sistema para ejecutar los comando Composer y Artisan:
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Definimos el directorio de trabajo dentro de nuestra imagen
WORKDIR /var/www

USER $user

# CMD php artisan queue:work

4.3. Creación del fichero de configuración para el servidor web con Nginx

Utilzaremos el fichero que vamos a definir para el servidor Nginx desde docker-compose, en nuestro proyecto creamos una carpeta denominada docker-compose y dentro otra llamada nginx, aquí creamos el fichero cx-lpm-orders-server.conf dentro de la carpeta nginx creada anteriormente y con la siguiente configuración:

server {
     listen 80;
     index index.php index.html;
     error_log  /var/log/nginx/error.log;
     access_log /var/log/nginx/access.log;
     root /var/www/public;
     location ~ .php$ {
         try_files $uri =404;
         fastcgi_split_path_info ^(.+.php)(/.+)$;
         fastcgi_pass enterprise-001-app:9000;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;
     }
     location / {
         try_files $uri $uri/ /index.php?$query_string;
         gzip_static on;
     }
 }

Es un fichero de configuración básico para Nginx, lo único que podrás ver algo diferente es donde hacemos referencia al equipo que orders-app-lpm que definiremos con docker-compose.

4.4. Configuración con docker-compose de Laravel / Servidor Web / MySQL

En nuestro fichero de configuración de docker-compose vamos a definir 3 servicios y 1 red, los servicios que definiremos serán:

  • orders-app: en este servicio instalamos una imagen con PHP en concreto la versión php:7.4-fpm, la variante que se utiliza aquí correspondiente a php:<version>-fpm es una variante la cual contiene una implementación FastCGI para PHP, esta configuración la definimos anteriormente en el fichero Dockerfile.
  • orders-db: este servicio lo vamos a dedicar a nuestra base de datos MySQL para ello partiremos de la imagen: mysql:5.7, utilizaremos los parámetros para la creación de los usuarios, claves y base de datos inicial, la definición por defecto de Laravel en el fichero .env.
  • orders-nginx: nuestro servidor de aplicaciones web donde lanzaremos nuestra aplicación, utilizamos como ya hemos visto una configuración estándar en cx-lpm-orders-server.conf, lo único que necesitamos activar el servicio fastcgi al utilizar la imagen php:7.4-fpm

Como red definimos net-cx-lpm-customerdb-orders que tiene una configuración básica en modo bridge como veremos asociaremos todos los servicios dentro de la misma red para que estén interconectados.

Fichero docker-compose

La creación del fichero docker-compose sigue la misma estructura que el publicado en la aplicación ADMIN-APP, es por eso que no entramos en detalles, allí ya lo explicamos todo. Este el fichero docker-compose que utilizaremso para la aplicación ORDERS APP

version: "3"
# En el nodo services para incluir los servicios app, db y nginx.
services:
  orders-app:
    build:
      args:
        user: xules
        uid: 1000
      context: ./
      dockerfile: Dockerfile
    image: cx-lpm-customerdb-orders-app
    container_name: cx-lpm-customerdb-orders-app
    restart: unless-stopped
    working_dir: /var/www/
    volumes:
      - ./:/var/www
    networks:
      - net-cx-lpm-customerdb-orders        
  orders-db:
    image: mysql:latest
    container_name: cx-lpm-customerdb-orders-db
    restart: unless-stopped
    ports:
     - 127.0.0.1:23308:3306
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ../cx-lpm-customerdb-orders-db/var/lib/mysql:/var/lib/mysql
    networks:
      - net-cx-lpm-customerdb-orders

  orders-nginx:
    image: nginx:alpine
    container_name: cx-lpm-customerdb-orders-nginx
    restart: unless-stopped
    ports:
      - 127.0.0.1:28002:80
    volumes:
      - ./:/var/www
      - ./docker-compose/nginx:/etc/nginx/conf.d/
    networks:
      - net-cx-lpm-customerdb-orders
networks:
  net-cx-lpm-customerdb-orders:
    driver: bridge



En este punto y antes de lanzar la construcción de los contenedores tenemos que definir las variables de entorno para la base de datos en el fichero .env:

DB_CONNECTION=mysql
DB_HOST=cx-lpm-customerdb-orders-db
DB_PORT=3306
DB_DATABASE=ordersminidb
DB_USERNAME=xules
DB_PASSWORD=xulescode

Construimos nuestros contenedores e instalamos dependencias

Una vez que ya hemos completado nuestro fichero llega el momento de construirlo para ello docker-compose descargá las imágenes solicitadas sino disponemos de ellas en nuestro equipo, antes os dejo el fichero completo de docker-compose, despliega para ver la información completa:

Una vez tenemos completo el fichero docker-compose ya podemos lanzar la construcción de las indicaciones del fichero utilizamos uno de los comandos que nos proporciona docker-compose que es build, también podemos construirlo y lanzarlo con up, en nuestro caso vamos a hacerlo todo directamente con up:

xules@xxxxx:~/$ docker-compose up 

Con la aplicación levantada procedemos a instalar composer y node, para instalar composer lanzamos composer install dentro del contenedor:

xules@xxxx:/$ docker-compose exec orders-app composer install

Seguimos ahora con la generación de la clave para nuestra aplicación con la llamada a artisan, para ello con docker-compose llamamos a la aplicación app para que ejecute la generación automática de la clave:

xules@xxxxx:~/$ docker-compose exec orders-app php artisan key:generate
Application key set successfully.

Instalamos node y npm con los paquetes que hemos decargado y copiado de la imagen original:

xules@xxxxx:~/$ docker-compose exec orders-app npm install 

Comprobamos que ya se creó automáticamente la base de datos ordersminidb, accediendo al contenedor de MySQL:

xules@xxxxx:~/$ $ docker exec -it cx-lpm-customerdb-orders-db bash
 root@d3a651e7d7e0:/# mysql -u root -p
 Enter password:  

Ya estamos dentro del contenedor de la base de datos ahora vamos a crear la base de datos que utilizaremos:

mysql&amp;gt; show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | &amp;lt;strong&amp;gt;ordersminidb&amp;lt;/strong&amp;gt;       |
 | performance_schema |
 | sys                |
 +--------------------+
 5 rows in set (0.01 sec)  

Ahora ya podemos comprobar que tenemos listo nuestro proyecto para empezar accediendo en el navegador a http://localhost:28021/, si todo fue bien verá la info por defecto de creación de un proyecto con Laravel:

AÑADIR IMAGEN

Con el proyecto creado ya podemos empezar con la creación de los modelos y controladores para las tablas cm_customer y cm_orders que nos servirán de base para la creación de pedidos.