Skip to content

Aplicación Java con acceso a Base de Datos Relacional

Notifications You must be signed in to change notification settings

jamj2000/FPBasics

Repository files navigation

FPBasics

Aplicación Java con acceso a Base de Datos Relacional

Introducción

Este proyecto es un adaptación del proyecto de ASIR2 del curso 2017-18 siguiente:

que fue realizado por los siguientes alumnos:

El proyecto ha sido modificado para desplegarlo en contenedores docker. Sirve como material didáctico para el módulo Despliegue de Aplicaciones Web de 2º DAW del curso 2018-19.

La documentación de este proyecto está accesible en este enlace.

Software utilizado

Software

Despliegue local en Tomcat+SQLServer con contenedores docker

A continuación se muestran los pasos para desplegar la aplicación en el Contenedor de servlets y servidor web Tomcat (Version 8.0.53). También necesitaremos el Gestor de BBDD MS SQL Server (Versión 2019).

Para ello necesitaremos cada una de estas imágenes. Ambas están disponibles en DockerHub.

Pasos a seguir

Los pasos que siguen se han realizado en SO GNU/Linux. Ha funcionado en Ubuntu 16.04 y en Ubuntu 18.04.

  1. Instalamos el software básico
sudo  apt  install  docker.io  docker-compose  openjdk-8-jdk  openjdk-8-jre  maven  git
  1. Descargamos código fuente del proyecto y entramos en la carpeta
git  clone  https://github.com/jamj2000/FPBasics.git
cd  FPBasics

NOTA: Antes de continuar deberemos comprobar el archivo src/main/resources/applicationContext.xml. Allí indicamos el host donde está la base de datos. Debe existir la línea

<property name="url" value="jdbc:jtds:sqlserver://sqlserver:1433/FPBASICS;instance=SQLEXPRESS" />

en lugar de

<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/FPBASICS;instance=SQLEXPRESS" />

puesto que utilizaremos el SqlServer de un contenedor y no el de localhost.

Está configuración también puede cambiarse una vez desplegada la aplicación. Para ello ver el paso 14 de esta guía.

  1. Probamos maven
mvn

Debe apareceer algo parecido a lo siguiente:

mvn

Nos aparecen bastantes metas:

validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package , pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy

Ahora mismo nos interesa la meta package.

  1. Ejecutamos la meta para generar un paquete
mvn  package

mvn package

Esto debería crear una carpeta target y dentro un archivo FPBasics-0.0.1.war.

tomcat archivo war

  1. Comprobamos que el archivo docker-compose.yml tiene el siguiente contenido:
cat  docker-compose.yml
version: "2"
services:
    tomcat:
        image: "tomcat:8.0-jre8"
        ports:
            - "8080:8080"
        depends_on:
            - sqlserver
    sqlserver:
        # image: "microsoft/mssql-server-linux:2017-latest" # Imagen obsoleta 
        image: "mcr.microsoft.com/mssql/server:2019-latest"
        environment:
            SA_PASSWORD: "Temporal22"
            ACCEPT_EULA: "Y"
        volumes:
            ./docs/:/data
  1. Ejecutamos
docker-compose  up  -d

Este comando descargará las imágenes indicadas anteriormente y creará un contenedor por cada una de ellas.

docker-compose up -d

Deberían haberse bajado las imágenes y lanzado 2 contenedores, con nombres:

  • fpbasics_tomcat_1
  • fpbasics_sqlserver_1

AVISO: Las 2 imágenes ocupan un total de unos 2 GB aproximadamente.

docker images

Con el comando docker images podemos ver las imágenes descargadas en nuestro disco. Deberían aparecer las siguientes:

  • tomcat:8.0-jre8 (463MB)
  • mcr.microsoft.com/mssql/server:2019-latest (1.43GB)
  1. Si todo ha ido bien, abriremos la URL localhost:8080 en el navegador y veremos lo siguiente:

tomcat local

  1. Podemos comprobar que necesitamos autenticación para acceder a Server Status, Manager App y Host Manager.

Para solucionar esto debemos modificar el contenedor. Los pasos son:

  • Entramos en el contenedor de tomcat
docker  exec  -it  fpbasics_tomcat_1  bash
  • Editamos el archivo /usr/local/tomcat/conf/tomcat-users.xml. Puesto que el contenedor no tiene instalado ningún editor de texto, instalaremos nano dentro del contenedor.

edit tomcat-users

Y luego el final del archivo debe quedar así:

save tomcat-users

Las líneas e insertar son:

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
  1. Salimos del contenedor con el comando exit. Es aconsejable guardar los cambios hechos en el contenedor en una nueva imagen. La llamaré tomcat:fpbasics. Así en un futuro podré crear contenedores nuevos a partir de la nueva imagen, que ya tendrá los cambios previos.

    Para crear la nueva imagen a partir de un contenedor modificado hacemos:

    docker  commit  fpbasics_tomcat_1  tomcat:fpbasics
    

    tomcat commit

  2. Reiniciamos el contenedor.

docker  restart  fpbasics_tomcat_1
  1. Refrescamos la página localhost:8080 y entramos en Manager App con el usuario y clave configurados anteriormente.

tomcat manager

tomcat autenticación

  1. Si todo ha ido bien veremos el Gestor de Aplicaciones

tomcat gestor de aplicaciones

  1. Desplegamos el archivo FPBasics-0.0.1.war

Nos vamos a la sección Archivo WAR a desplegar y pulsamos en Seleccionar archivo. tomcat desplegar

Buscamos el archivo en la carpeta target tomcat archivo war

Pulsamos en el botón Desplegar y nos debe aparecer en la sección Aplicaciones.
tomcat desplegar

Si pulsamos en dicho enlace debemos ver la aplicación desplegada. tomcat desplegar proyecto

  1. Es necesario entrar en el contenedor y modificar el archivo webapps/FPBasics-0.0.1/WEB-INF/classes/applicationContext.xml.
docker  exec  -it  fpbasics_tomcat_1  bash
nano webapps/FPBasics-0.0.1/WEB-INF/classes/applicationContext.xml

WEB-INF/classes/applicationContext.xml

La línea

<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/FPBASICS;instance=SQLEXPRESS" />

debe modificarse a

<property name="url" value="jdbc:jtds:sqlserver://sqlserver:1433/FPBASICS;instance=SQLEXPRESS" />

Esto cambia el servidor de bases de datos. En lugar de localhost será sqlserver, que es el servicio que estamos ejecutando.

Guardamos los cambios. Salimos del contenedor con el comando exit.

Para actualizar la nueva imagen a partir del contenedor modificado hacemos:

docker  commit  fpbasics_tomcat_1  tomcat:fpbasics
  1. Accedemos a la aplicación. La clave de acceso es usuario

fpbasics desplegado 1

fpbasics desplegado 2

  1. ¿Y los datos? El contenedor fpbasics_sqlserver_1 no tiene datos introducidos. Así que la aplicación dará una excepción cuando intentemos consultar algunas de las tablas.

Para solucionar esto debemos modificar el contenedor. Los pasos son:

  • Entramos en el contenedor de sqlserver
docker  exec  -it  fpbasics_sqlserver_1  bash
  • Ejecutamos los scripts CrearTablas.sql e InsertarDatos.sql con el comando sqlcmd.
cd /data 
ls
/opt/mssql-tools/bin/sqlcmd -U SA -P Temporal22 -i CrearTablas.sql
/opt/mssql-tools/bin/sqlcmd -U SA -P Temporal22 -i InsertarDatos.sql

fpbasics desplegado 1

NOTA: Da algunos avisos, puesto que los datos están incompletos.

  1. Salimos del contenedor. Es aconsejable guardar los cambios hechos en el contenedor en una nueva imagen. La llamaré sqlserver:fpbasics. Así en un futuro podré crear contenedores nuevos a partir de la nueva imagen, que ya tendrá los cambios previos.

Para crear la nueva imagen a partir de un contenedor modificado hacemos:

docker  commit  fpbasics_sqlserver_1  sqlserver:fpbasics

sqlserver commit

  1. Resultado final

fpbasics desplegado 3

  1. BONUS

Si utilizamos el archivo docker-compose.tomcat.yml podemos lanzar los contenedores con todos los cambios previos ya realizados. Se descargaran las imagenes con los commits desde mi cuenta en DockerHub.

Para ello detenemos los contenedores previos:

docker-compose  down

Y lanzamos los contenedores desde las imágenes modificadas:

docker-compose -f docker-compose.tomcat.yml  up  -d

Despliegue local en WildFly+SQLServer con contenedores docker

A continuación se muestran los pasos para desplegar la aplicación en el Servidor de aplicaciones WildFly (Version 8.2.1.Final). También necesitaremos el Gestor de BBDD MS SQL Server (Versión 2019).

JBoss (proyecto mantenido por la comunidad de software de código abierto) ha cambiado el nombre a WildFly para evitar la confusión y diferenciar del proyecto con soporte comercial JBoss EAP (Enterprise Application Platform). Actualmente ambos están bajo el paraguas de RedHat.

Para ello necesitaremos cada una de estas imágenes. Ambas están disponibles en DockerHub.

Pasos a seguir

Los pasos que siguen se han realizado en SO GNU/Linux. Ha funcionado en Ubuntu 16.04 y en Ubuntu 18.04.

  1. Instalamos el software básico
sudo  apt  install  docker.io  docker-compose  openjdk-8-jdk  openjdk-8-jre  maven  git
  1. Descargamos código fuente del proyecto y entramos en la carpeta
git  clone  https://github.com/jamj2000/FPBasics.git
cd  FPBasics

NOTA: Antes de proseguir deberemos comprobar el archivo src/main/resources/applicationContext.xml. Allí indicamos el host donde está la base de datos. La línea

<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/FPBASICS;instance=SQLEXPRESS" />

debe modificarse a

<property name="url" value="jdbc:jtds:sqlserver://sqlserver:1433/FPBASICS;instance=SQLEXPRESS" />

puesto que utilizaremos el SqlServer de un contenedor y no el de localhost.

Está configuración también puede cambiarse una vez desplegada la aplicación.

  1. Probamos maven
mvn

Debe aparecer algo parecido a lo siguiente:

mvn

Nos aparecen bastantes metas:

validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package , pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy

Ahora mismo nos interesan las metas clean y package.

  1. Ejecutamos las metas para limpiar y generar nuevo paquete según el archivo pom.wildfly.xml.
mvn  clean  package  -f pom.wildfly.xml 

Necesitamos usar el archivo pom.wildfly.xml en lugar del pom.xml original, puesto que WildFly ya dispone de algunos artefactos que no es necesario incorporar. En concreto hemos añadido la línea <scope>provided</scope> a los artefactos jsf-api y jsf-impl. Los archivos .jar correspondientes se generan y almacenan en target/FPBasics-0.0.1/WEB-INF/lib/.

mvn clean package

Esto debería eliminar y volver a crear la carpeta target y dentro un archivo FPBasics-0.0.1.war.

tomcat archivo war

  1. Comprobamos que el archivo docker-compose.wildfly.yml tiene el siguiente contenido:
cat  docker-compose.wildfly.yml

docker-compose.wildfly.yml

version: "2"
services:
    wildfly:
        build:
             context: .
             dockerfile: Dockerfile.wildfly
        image: jamj2000/wildfly:fpbasics
        ports:
            - "8080:8080"
        depends_on:
            - sqlserver
    sqlserver:
        image: "jamj2000/sqlserver:fpbasics"
        environment:
            SA_PASSWORD: "Temporal22"
            ACCEPT_EULA: "Y"

En el archivo anterior indicamos que vamos a crear la imagen jamj2000/wildfly y para ello usaremos el archivo Dockerfile.wildfly, que tiene el siguiente contenido:

Dockerfile.wildfly

FROM  jboss/wildfly:8.2.1.Final
ADD  target/FPBasics-0.0.1.war  /opt/jboss/wildfly/standalone/deployments/

Utilizando la imagen jboss/wildfly:8.2.1.Final, vamos a copiar el archivo target/FPBasics-0.0.1.war dentro de la carpeta /opt/jboss/wildfly/standalone/deployments/ de dicha imagen. Esto nos servirá para crear la nueva imagen jamj2000/wildfly:fpbasics que habíamos indicado previamente en el archivo docker-compose.wildfly.yml.

  1. Para generar la imagen previa, descargar las imágenes que nos falten y lanzar los 2 contenedores necesarios, ejecutamos
docker-compose  -f docker-compose.wildfly.yml  up  -d

AVISO: Antes asegurate de parar cualquier servicio que tengas a la escucha en el puerto 8080, como Tomcat. WildFly utiliza también el puerto 8080.

Para eliminar los contenedores previos, en el caso de tenerlos:

docker-compose  rm  fpbasics_tomcat_1  -f
docker-compose  rm  fpbasics_sqlserver_1  -f

No te preocupes, no hemos borrado las imágenes del disco, por tanto en cualquier momento podríamos volver a lanzarlos.

docker-compose up

Es importante escribir las opciones y argumentos en el orden que se indica previamente. Como hemos dicho para realizar todo el trabajo seguiremos las indicaciones del archivo docker-compose.wildfly.yml.

Deberían haberse bajado las imágenes jboss/wildfly:8.2.1.Final y jamj2000/sqlserver:fpbasics, en caso de no tenerlas en disco ya, haberse creado la imagen jamj2000/wildfly:fpbasics y lanzado 2 contenedores, con nombres:

  • fpbasics_wildfly_1
  • fpbasics_sqlserver_1

AVISO: Las 2 imágenes ocupan un total de unos 2.2 GB aproximadamente.

Con el comando docker images podemos ver las imágenes descargadas en nuestro disco. A tí deberían aparecerte al menos las siguientes:

  • jboss/wildfly:8.2.1.Final (610MB)
  • microsoft/mssql-server-linux:2017-latest (1.44GB)
  1. Si todo ha ido bien, abriremos la URL localhost:8080 en el navegador y veremos lo siguiente:

wildfly local

  1. Accedemos a la aplicación. La clave de acceso es usuario

fpbasics desplegado

  1. ¿Y los datos? El contenedor fpbasics_sqlserver_1 que tenemos se basa en una imagen que habíamos modificado previamente y la cual contiene los datos. Por tanto este problema está resuelto.

No obstante podemos asegurarnos, entrando al contenedor y usando sqlcmd para realizar consultas.

  • Entramos en el contenedor de sqlserver
docker  exec  -it  fpbasics_sqlserver_1  bash
  • Ejecutamos el comando sqlcmd.
/opt/mssql-tools/bin/sqlcmd -U SA -P Temporal22 
  • Realizamos las consultas.

SQL Server consultas

  1. BONUS

Desde mi cuenta en DockerHub puedes bajarte las imágenes modificadas.

ANEXO: Archivos desplegados

/usr/local/tomcat

tomcat

/usr/local/tomcat/webapps

tomcat/webapps

/usr/local/tomcat/webapps/FPBasics-0.0.1

tomcat/webapps/FPBasics

/usr/local/tomcat/webapps/FPBasics-0.0.1/WEB-INF/lib

tomcat/webapps/FPBasics/WEB-INF/lib

/usr/local/tomcat/webapps/FPBasics-0.0.1/WEB-INF/classes

tomcat/webapps/FPBasics/WEB-INF/classes

/usr/local/tomcat/webapps/FPBasics-0.0.1/WEB-INF/classes/mappers

tomcat/webapps/FPBasics/WEB-INF/classes/mappers

/usr/local/tomcat/webapps/FPBasics-0.0.1/WEB-INF/classes/es/fpbasics

tomcat/webapps/FPBasics/WEB-INF/classes/es/FPBasics

About

Aplicación Java con acceso a Base de Datos Relacional

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published