Aplicación Java con acceso a Base de Datos Relacional
Este proyecto es un adaptación del proyecto de ASIR2 del curso 2017-18 siguiente:
que fue realizado por los siguientes alumnos:
- García Jiménez, Javier
JPimenton
- Rosa Martín, Francisco Javier
xaviroma
- Saavedra Conejo, Luciano
lucisaavedra98
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.
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.
- https://hub.docker.com/_/tomcat/ . Usaremos el tag 8.0-jre8
- https://hub.docker.com/_/microsoft-mssql-server . Usaremos el tag 2019-latest
Los pasos que siguen se han realizado en SO GNU/Linux. Ha funcionado en Ubuntu 16.04 y en Ubuntu 18.04.
- Instalamos el software básico
sudo apt install docker.io docker-compose openjdk-8-jdk openjdk-8-jre maven git
- 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.
- Probamos maven
mvn
Debe apareceer algo parecido a lo siguiente:
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
.
- Ejecutamos la meta para generar un paquete
mvn package
Esto debería crear una carpeta target
y dentro un archivo FPBasics-0.0.1.war
.
- 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
- Ejecutamos
docker-compose up -d
Este comando descargará las imágenes indicadas anteriormente y creará un contenedor por cada una de ellas.
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.
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)
- Si todo ha ido bien, abriremos la URL
localhost:8080
en el navegador y veremos lo siguiente:
- Podemos comprobar que necesitamos autenticación para acceder a
Server Status
,Manager App
yHost 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, instalaremosnano
dentro del contenedor.
Y luego el final del archivo debe quedar así:
Las líneas e insertar son:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
-
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
-
Reiniciamos el contenedor.
docker restart fpbasics_tomcat_1
- Refrescamos la página
localhost:8080
y entramos enManager App
con el usuario y clave configurados anteriormente.
- Si todo ha ido bien veremos el
Gestor de Aplicaciones
- Desplegamos el archivo
FPBasics-0.0.1.war
Nos vamos a la sección Archivo WAR a desplegar
y pulsamos en Seleccionar archivo
.
Buscamos el archivo en la carpeta target
Pulsamos en el botón Desplegar
y nos debe aparecer en la sección Aplicaciones
.
Si pulsamos en dicho enlace debemos ver la aplicación desplegada.
- 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
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
- Accedemos a la aplicación. La clave de acceso es
usuario
- ¿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
eInsertarDatos.sql
con el comandosqlcmd
.
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
NOTA: Da algunos avisos, puesto que los datos están incompletos.
- 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
- Resultado final
- 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
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.
- https://hub.docker.com/r/jboss/wildfly/ . Usaremos el tag 8.2.1.Final
- https://hub.docker.com/r/jamj2000/sqlserver/ . Usaremos el tag fpbasics (creado previamente)
Los pasos que siguen se han realizado en SO GNU/Linux. Ha funcionado en Ubuntu 16.04 y en Ubuntu 18.04.
- Instalamos el software básico
sudo apt install docker.io docker-compose openjdk-8-jdk openjdk-8-jre maven git
- 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.
- Probamos maven
mvn
Debe aparecer algo parecido a lo siguiente:
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
.
- 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/
.
Esto debería eliminar y volver a crear la carpeta target
y dentro un archivo FPBasics-0.0.1.war
.
- 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
.
- 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.
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)
- Si todo ha ido bien, abriremos la URL
localhost:8080
en el navegador y veremos lo siguiente:
- Accedemos a la aplicación. La clave de acceso es
usuario
- ¿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.
- BONUS
Desde mi cuenta en DockerHub puedes bajarte las imágenes modificadas.