DOCKER + IMAGEN TOMCAT - JAVA APP
Arquitectura de Computadoras
Integrantes:
Elvin Joel Molina Álvarez – 202010110145
Estefany Alejandra Cruz García – 202010110186
Oscar Adrián Machado Sanders – 201910010829
Roberto Alexis Machado Valenzuela – 202110080107
Christian André Alvarado Reyes – 201910010261
Catedrático:
Kenny Joseph Cooper Alemán
Fecha:
13 de marzo de 2022
[1]
INDICE
Contenido
INTRODUCCIÓN..................................................................................................3
LA APLICACIÓN..................................................................................................4
Características de la aplicación....................................................................6
¿Para qué sirve la aplicación?....................................................................11
¿Cómo se utiliza la aplicación?...................................................................12
Instrucciones para la instalación de Docker.................................................16
Configuraciones de la imagen Tomcat.......................................................17
Dockerfile con la configuración..................................................................18
EJEMPLO DE USO: SOFTWARE SOBRE DOCKER......................................25
CONCLUSIONES...............................................................................................26
BIBLIOGRAFIA..................................................................................................27
[2]
INTRODUCCIÓN
Este documento sirve como una breve introducción a algunos de los conceptos
y terminología detrás de Docker y del contenedor Tomcat. También, se
pretende que sirva de ayuda para los conceptos más inmediatos de instalación
y configuración.
Docker
Docker es una plataforma abierta para desarrollar, enviar y ejecutar
aplicaciones. Docker permite separar las aplicaciones para aislarlas de nuestra
infraestructura de software (host). Al aprovechar las metodologías de Docker
para enviar, probar e implementar el código rápidamente, puede reducir
significativamente la demora entre escribir el código y ejecutarlo en producción.
Tomcat
El software Apache Tomcat® es una implementación de código abierto de las
especificaciones de la plataforma Jakarta EE.
Tomcat proporciona un entorno de servidor web HTTP de "Java puro" en el que
se puede ejecutar código Java.
Vistazo breve
En los siguientes párrafos de contenido se explicarán todos los pasos para
comprender en qué consisten los servlets, sus componentes, las características
de la aplicación y sus usos, y la configuración de la app dentro y fuera de los
contenedores de Docker.
[3]
LA APLICACIÓN
Tomcat es un contenedor de Servlets con un entorno JSP. Un contenedor de
Servlets es un shell de ejecución que maneja e invoca servlets por cuenta del
usuario.
Podemos dividir los contenedores de Servlets en:
1. Contenedores de Servlets Stand-alone (Independientes)
Estos son una parte integral del servidor web. Este es el caso cuando
usando un servidor web basado en Java, por ejemplo, el contenedor de
servlets es parte de JavaWebServer (actualmente sustituido
por iPlanet). Este el modo por defecto usado por Tomcat.
Sin embargo, la mayoría de los servidores, no están basados en Java,
los que nos lleva los dos siguientes tipos de contenedores:
2. Contenedores de Servlets dentro-de-Proceso
El contenedor Servlet es una combinación de un plugin para el servidor
web y una implementación de contenedor Java. El plugind del servidor
web abre una JVM (Máquina Virtual Java) dentro del espacio de
direcciones del servidor web y permite que el contenedor Java se
ejecute en él. Si una cierta petición debería ejecutar un servlet, el plugin
toma el control sobre la petición y lo pasa al contenedor Java (usando
JNI). Un contenedor de este tipo es adecuado para servidores multi-
thread de un sólo proceso y proporciona un buen rendimiento pero está
limitado en escalabilidad
3. Contenedores de Servlets fuera-de-proceso
El contenedor Servlet es una combinación de un plugin para el servidor
web y una implementación de contenedor Java que se ejecuta en una
JVM fuera del servidor web. El plugin del servidor web y el JVM del
contenedor Java se comunican usando algún mecanismo IPC
(normalmente sockets TCP/IP). Si una cierta petición debería ejecutar un
servlet, el plugin toma el control sobre la petición y lo pasa al contenedor
Java (usando IPCs). El tiempo de respuesta en este tipo de
[4]
contenedores no es tan bueno como el anterior, pero obtiene mejores
rendimientos en otras cosas (escalabilidad, estabilidad, etc.).
Tomcat puede utilizarse como un contenedor solitario (principalmente para
desarrollo y depuración) o como plugin para un servidor web existente
(actualmente se soporan los servidores Apache, IIS y Netscape). Esto significa
que siempre que despleguemos Tomcat tendremos que decidir cómo usarlo, y,
si seleccionamos las opciones 2 o 3, también necesitaremos instalar un
adaptador de servidor web.
[5]
Características de la aplicación
En 2019 se daba soporte únicamente a las versiones mayores 7.x, 8.5.x y 9.x,
siendo consideradas las dos primeras versiones antiguas.
Tomcat 3.x (distribución inicial)
Implementado a partir de las especificaciones Servlet 2.2 y JSP 1.1
Recarga de servlets
Funciones básicas HTTP
Versión sin soporte
Tomcat 4.x
Implementado a partir de las especificaciones Servlet 2.3 y JSP 1.2
Contenedor de servlets rediseñado como Catalina.
Motor JSP rediseñado con Jasper.
Conector Coyote
Java Management Extensions (JMX), JSP Y administración basada
en Struts.
Versión sin soporte
Tomcat 5.x
Implementado a partir de las especificaciones Servlet 2.4 y JSP 2.0
Recolección de basura reducida.
Capa envolvente nativa para Windows y Unix para la integración de las
plataformas.
Análisis rápido JSP
Versión sin soporte
Tomcat 6.x
Implementado de Servlet 2.5 y JSP 2.1
[6]
Soporte para Unified Expression Language 2.1
Diseñado para funcionar en Java SE 5.0 y posteriores.
Soporte para Comet a través de la interfaz CometProcessor.
Versión sin soporte
Tomcat 7.x
Implementado de Servlet 3.0 JSP 2.2 y EL 2.2
Mejoras para detectar y prevenir "fugas de memoria" en las aplicaciones
web.
Limpieza interna de código.
Soporte para la inclusión de contenidos externos directamente en una
aplicación web.
Pero no basta simplemente con situar los archivos, también es necesario
indicar de forma global su localización final. Esto se hace mediante la definición
de la variable global CATALINA_HOME, que contendrá el path del servidor de
aplicaciones.
Los aspectos de configuración más importantes se encuentran recogidos en
dos ficheros situados bajo "%CATALINA_HOME%conf".
"[Link]" que recoge los valores por defecto a utilizar por todas las
aplicaciones web cargadas en la instancia de Tomcat, como pudiera ser,
por ejemplo, la página a cargar por defecto.
"[Link]" que contiene la definición estructural del servidor: Nombre
del host, servicios, conectores, etc.
[7]
Los componentes del fichero [Link] se reflejan en la siguiente tabla:
Etiqueta Explicación Ejemplo
(Único y engloba
toda la
configuración)
Define el elemento
de configuración
básico del fichero
[Link]. Es
único y contiene
uno o más <Server port="8005"
<server>
servicios
</server> shutdown="SHUTDOWN">
("Service"). El
atributo "port"
indica el puerto
destinado a la
escucha del
comando de
cierre, indicado
por "shutdown" o
cierre.
(Único) Permiten <Listener
definir las clases className="[Link]
<Listener/>
JMX que permitirá
escuchar Tomcat. [Link]" />
(Único) Permite
<GlobalNaming
definir elementos
Resources>
JNDI para ser
</GlobalNamin
utilizados
gResources>
globalmente.
<Service> Estas etiquetas <Service name="Tomcat-
</Service> permiten agrupar
Standalone"> </Service>
uno o más
conectores de
forma que
compartan un
único contenedor
de aplicaciones.
Poseen un único
atributo, "name",
que fija los
identificadores
individuales. Si
[8]
Etiqueta Explicación Ejemplo
"name" se fija
como "Catalina" o
"Tomcat-
Standalone", se
habilitará a
Tomcat como
servidor web
independiente.
Conecta un
contenedor de
datos con el
exterior,
definiendo el
<Connector
elemento final a
través del cual se className="[Link]
realizarán las
[Link]" port="8080"
peticiones de
usuario y se minProcessors="5"
enviarán las
<Connector /> maxProcessors="75"
respuestas. Entre
(dentro de
sus parámetros de enableLookups="true"
"Service")
configuración
acceptCount="100"
están el puerto de
escucha, "port", la connectionTimeout="20000"
clase encargada
useURIValidationHack="false"
de su definición,
"className" y el disableUploadTimeout="true" />
número máximo
de conexiones
simultáneas
permitidas,
"acceptCount".
(dentro de
"Service") Punto
donde se
procesan las
peticiones que <Engine name="Standalone"
<Engine>
llegan a los
</Engine> defaultHost="localhost">
"Connector" que
posean en la
cabecera el valor
de "defaultHost"
como destino.
<Logger/> (dentro de <Logger
[9]
Etiqueta Explicación Ejemplo
"Service" o de
"Host") Permite
establecer el
nombre del fichero
de logs. Como
parámetros tiene className="[Link]
la clase encargada ger .FileLogger" prefix="catalina_log."
de su definición,
"className", el suffix=".txt" timestamp="true"/>
formato nombre
del archivo, como
la unión de un
prefijo, "preffix", y
un sufijo, "suffix".
Con estas
<Host name="localhost" debug="0"
etiquetas podemos
definir uno o más appBase="webapps"
<Host>
elementos Host
</Host> unpackWARs="true"
virtuales para
atender a las autoDeploy="true">
peticiones.
(dentro de "Host")
Se utiliza para
indicar la ruta
("docBase") a
partir de la cual se
encuentran las
aplicaciones a ser
<Context>
ejecutadas en
</Context>
Tomcat (a partir de
"%CATALINA_HO
ME%webapps" y
el path url ("path")
a partir del cual
acceder a los
servicios.
(Junta de Andalucia, s.f.)
[10]
¿Para qué sirve la aplicación?
Apache Tomcat, el servidor web usado en tradicionalmente para proyectos
Java por su implementación de servlets o páginas JSP, es otra de las
aplicaciones que podemos desplegar fácilmente en los Servidores Cloud de
Arsys desde el Catálogo de Aplicaciones.
Las páginas web en sí mismas son archivos HTML estáticos. Por lo tanto, un
cliente no puede interactuar con una página web estática. Para facilitar
nuestras páginas web con capacidades dinámicas, se requiere un servidor
web. Para poder interactuar la aplicación de uno con el servidor web, se
proporcionan API (interfaces de programación de aplicaciones) predefinidas.
Servlet es una de esas API proporcionada por Java Platform Enterprise Edition,
diseñada para trabajar junto con servidores web. La supervisión del servidor
para las solicitudes de clientes entrantes no es el trabajo de un servlet, sino el
de un servidor web.
Apache Tomcat (o, sencillamente, Tomcat) es un contenedor de servlets que
se puede usar para compilar y ejecutar aplicaciones web realizadas en Java.
Implementa y da soporte tanto a servlets como a páginas JSP (Java Server
Pages) o Java Sockets. Además, Tomcat es compatible con otras tecnologías
como Java Expression Language y Java WebSocket, del ecosistema Java.
Tomcat puede funcionar de manera autónoma como motor de aplicaciones web
desarrolladas con Java, aunque habitualmente se usa en combinación con
otros productos como el servidor web Apache, para dar un mayor soporte a
tecnologías y aumentar sus características.
[11]
¿Cómo se utiliza la aplicación?
Para usar esta aplicación deberá contar con los siguientes Stack Tecnologicos:
Este es el stack tecnológico elegido para implementar la funcionalidad "Apache
Tomcat":
Java 8
Docker - Tecnología de Contenedores/Containers
Docker Hub - Repositorio de Docker Público donde se ubican las
imágenes oficiales
Apache Tomcat - Contenedor de Servlets
(Docker Hub - Tomcat, s.f.)
Ejecutar el servidor Tomcat predeterminado (CMD ["[Link]", "run"]):
$ docker run -it --rm tomcat:9.0
Puede probarlo visitando [Link] en un navegador o, si
necesita acceso fuera del host, en el puerto 8888:
$ docker run -it --rm -p 8888:8080 tomcat:9.0
Luego puede ir a [Link] o [Link] en un
navegador (tenga en cuenta que devolverá un 404 ya que no hay
aplicaciones web cargadas de forma predeterminada).
El entorno Tomcat predeterminado en la imagen es:
CATALINA_BASE: /usr/local/tomcat
CATALINA_HOME: /usr/local/tomcat
CATALINA_TMPDIR: /usr/local/tomcat/temp
JRE_HOME: /usr
CLASSPATH:
/usr/local/tomcat/bin/[Link]:/usr/local/tomcat/bin/[Link]
[12]
Los archivos de configuración están disponibles
en /usr/local/tomcat/conf/. De forma predeterminada, no se incluye a
ningún usuario en la función "manager-gui" necesaria para operar la aplicación
web "/manager/html". Si desea utilizar esta aplicación, debe definir dicho
usuario en [Link].
Se accede a la URL del Apache Tomcat con:
[Link]
Se accede a la API del fichero WAR con REST:
[Link]
Esta aplicación muestra un mensaje de saludo cada vez que lo invocas (JSON)
[13]
Para acceder a la consola pulsando a "Manager App" desde la consola UI de
Tomcat.
Desde este punto se puede gestionar todo lo que esta implementado pudiendo
gestionar: paradas, arranques, etc.
Nota: Si no se utiliza el despliegue directo desde el volumen se puede añadir
de forma externa el WAR desde aquí una vez arrancado el Tomcat
[14]
(Apache Tomcat, s.f.)
[15]
Instrucciones para la instalación de Docker
(Sin especificar versión). Descargará por defecto la última versión de
Tomcat.
docker pull tomcat
Imagen descargada
Versión especifica (Usada en el proyecto: 8.0-alpine)
docker pull tomcat:8.0-alpine
Imagen descagada
[16]
Configuraciones de la imagen Tomcat
Tomcat posee configuraciones por defecto que se pueden modificar a través de
los archivos .xml, en este apartado, nos basaremos en 2 configuraciones:
Configuración de roles para tomcat-users: Crear usuarios para permitir el
logueo en la página del servidor tomcat.
El servidor posee 3 funciones que necesitan la configuración de usuarios
tomcat para poder accesar a ellas:
1. Server Status/Estado del Servidor
2. Manager App/Administración de las aplicaciones
3. Host Manager/ Administración del host.
Roles que existen para los usuarios tomcat:
1. admin-gui y admin-script son dos roles Tomcat integrados, y la función
host-manager necesita el soporte de estos dos roles. Entre ellos,
admin-gui se usa para controlar la autoridad de acceso a la página, y
admin-script se usa para controlar el host-manager en forma de texto
simple.
2. Entre ellos, manager-gui se usa para controlar el acceso a la página del
administrador, y manager-script se usa para controlar el acceso al
administrador en forma de texto simple.
3. manager-jmx: Permite acceder al proxy JMX.
[17]
Configuración de la página web por defecto de tomcat.
Ambas configuraciones están descritas en el dockerfile que creará una nueva
que tendrá como imagen base (previamente descargada con la versión 8.0)
Dockerfile con la configuración
FROM tomcat:8.0-alpine
LABEL maintainer="Grupo8"
RUN mkdir /usr/local/tomcat/webapps/admin; \
mv /usr/local/tomcat/webapps/ROOT/*
/usr/local/tomcat/webapps/admin/
#Todos los archivos deben estar en la misma carpeta donde estará
el dockerfile
COPY [Link] /usr/local/tomcat/webapps/
COPY [Link] /usr/local/tomcat/conf/
COPY [Link] /usr/local/tomcat/webapps/ROOT
EXPOSE 8080
CMD ["[Link]", "run"]
Instrucción 1: FROM
FROM tomcat:8.0-alpine
Se especifica la imagen base que se usará para sobrescribirse con la nueva
configuración que se detalla en las siguientes líneas del dockerfile.
Instrucción 2: LABEL
LABEL maintainer=”Grupo8”
La instrucción establece el campo Autor de las imágenes generadas.
Esto será visible al momento de ejecutar el comando:
docker -id_contenedor- inspect
[18]
Instrucción 3: RUN
RUN mkdir /usr/local/tomcat/webapps/admin; \
mv /usr/local/tomcat/webapps/ROOT/*
/usr/local/tomcat/webapps/admin/
RUN se usa básicamente para correr un comando, ya sea instalar un servicio,
eliminar ficheros, crear directorios, etc. Se puede ejecutar las veces que lo
necesitemos dentro del dockerfile.
En el script mostrado, se usa para:
- Crear una carpeta en el contenedor llamada admin con la dirección:
/usr/local/tomcat/webapps/
- Mover los archivos y subdirectorios que estén en ROOT hacia la nueva
carpeta (admin) anteriormente creada:
/usr/local/tomcat/webapps/admin
¿Para qué se realiza esta configuración en el dockerfile?
Tomcat posee configuraciones por defecto, una de ellas es mostrar la página
por default del servidor al usar “localhost” en nuestro navegador, y para
finalidades del proyecto, se desea que la página por default sea la aplicación
jsp creada, pero a la vez no perder la página del servidor de tomcat, ya que
[19]
esta nos permite configurar de forma gráfica el mismo; así que se traspasará
mediante el comando mv toda la información (archivos) de la default page de
tomcat hacia la nueva carpeta llamada admin, y al ejecutar
localhost:puertopc/admin/ podremos visualizar la página del servidor
tomcat.
Instrucción 4: COPY (línea 6, 7 y 8)
#Todos los archivos deben estar en la misma carpeta donde estará el
dockerfile
COPY [Link] /usr/local/tomcat/webapps/
COPY [Link] /usr/local/tomcat/conf/
COPY [Link] /usr/local/tomcat/webapps/ROOT
La instrucción COPY, indica a Docker que coja los archivos de nuestro equipo y
los añada a la imagen con la que estamos trabajando. COPY crea un directorio
en caso de que no exista. Indica que queremos coger todos los archivos del
directorio actual (.) y trasladarlos a al directorio ./app de la imagen.
En el dockerfile se usa para:
- Copiar la [Link] para poder desplegar la aplicación desde el
contenedor.
- Copiar un archivo .xml con la configuración para los usuarios, aquí se
creará, eliminará o modificará cualquier usuario con sus determinados
roles.
- Copiar un archivo jsp que se moverá al directorio que tomcat tomará
como la página por defecto del servidor.
Contenido del archivo [Link]
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="admin"/>
[20]
<user username="admin" password="1234" roles="manager-
gui"/>
</tomcat-users>
- Copiar un archivo .jsp que poseerá la información de la página por
defecto del localhost.
Contenido del archivo [Link]
<%@ page language="java" contentType="text/html; charset=ISO-
8859-1" pageEncoding="ISO-8859-1"%>
<html>
<head>
<title>JSP Redirect</title>
</head>
<body>
<%
String redirectURL = "/AppLogin-1.0";
[Link](redirectURL);
%>
</body>
</html>
Instrucción 5: EXPOSE
EXPOSE 8080
La instrucción EXPOSE expone un puerto en particular con un protocolo
específico dentro de un contenedor Docker. En el término más simple, la
[21]
instrucción EXPOSE le dice a Docker que obtenga toda la información
requerida durante el tiempo de ejecución de un puerto específico.
Instrucción 6: CMD
CMD ["[Link]", "run"]
El propósito principal de un CMD es proporcionar valores por defecto para un
contenedor en ejecución. Estos valores predeterminados pueden incluir un
ejecutable, o pueden omitir el ejecutable.
El script [Link] se usa para iniciar y detener el servidor tomcat.
(Dockerfile Reference, s.f.)
(Programmer Click, s.f.)
(Apache Tomcat, s.f.)
(Programmer Click, s.f.)
(Medium, s.f.)
(Oracle-Base, s.f.)
(Acervolima, s.f.)
(Learn Tutorials, s.f.)
[22]
Instrucciones de la imagen especifica
Configuración de la imagen Docker: Tomcat
1. Crea un archivo dockerfile
1. FROM docker:5000/centos8-jdk-8u211:v1
2. MAINTAINER ljw
3. ADD [Link] /home
4. CMD sh /home/apache-tomcat-8.5.50/bin/[Link] &&
tail -f /home/apache-tomcat-8.5.50/logs/[Link]
5. EXPOSE 8080
Explicación por número de fila del código:
1. Operación de duplicación empaquetada en el entorno java con jdk-
8u211
2. Personal de mantenimiento
3. Copiar apache -[Link] en / home
4. Inicia Tomcat y ve el registro de inicio
5. Puerto predeterminado de Tomcat 8080
2. Crear una imagen (dockerfile y paquete tomcat en el mismo directorio de
nivel)
docker build -t centos8-tomcat8:v1 .
3. Ver la imagen construida
docker images
4. Crear un contenedor de imágenes de Tomcat
docker run -itd -p 8081:8080 -
v /root/software/tomcat8/logs:/home/apache-tomcat-8.5.50/l
ogs --name centos8-tomcat8 centos8-tomcat8:v1
[23]
Explicación de los comandos:
-d: ejecuta el contenedor en segundo plano y devuelve el ID del
contenedor;
-i: Ejecuta el contenedor en modo interactivo, generalmente se usa con -
t;
-t: reasigna una pseudo terminal de entrada para el contenedor,
generalmente se usa junto con -i;
-p: el puerto 8081 de la máquina se asigna al puerto 8080 del
contenedor
-v: monte el /home/apache-tomcat-8.5.50/logs del contenedor en el / root
/ software / tomcat8 / logs local
--name: nombre del contenedor, seguido del nombre de la imagen y el
número de versión
5. Verificar si el puerto esta escuchando
lsof -i:8081
6. Verificar la situación de montaje
ls /root/software/tomcat8/logs
7. Acceso al servicio Tomcat
[24]
EJEMPLO DE USO: SOFTWARE SOBRE DOCKER
[25]
CONCLUSIONES
Se busca agilizar el ciclo de vida de desarrollo al permitir que los
desarrolladores trabajen en entornos estandarizados utilizando contenedores
locales que proporcionan sus aplicaciones y servicios.
Docker es el encargado de proveer esta solución que trata de impulsar el uso
de tecnologías adaptativas que permitan el despliegue efectivo y escalado de
nuevas aplicaciones.
Tomcat posee de muchas ventajas como el ser open-source, permitir el
despliegue rápido de aplicaciones web y así mismo como su actualización,
además de ser posible utilizarlo gratuitamente para proyectos de índole
comercial.
La combinación de ambos nos ofrece una capa de abstracción decente que
abre las puertas a que nuestros proyectos basados en servlets funcionen en
cualquier plataforma en la que estén pronosticados a correr. Haciendo que
nuestras etapas de desarrollo y futuro mantenimiento se vuelvan menos
tediosas y más escalables en la práctica.
[26]
BIBLIOGRAFIA
Acervolima. (s.f.). Obtenido de [Link]
expose/
Apache Tomcat. (s.f.). Obtenido de [Link]
Apache Tomcat. (s.f.). Obtenido de Tomcat Docs:
[Link]
Docker Hub - Tomcat. (s.f.). Obtenido de [Link]
Dockerfile Reference. (s.f.). Obtenido de Docker Docs:
[Link]
Junta de Andalucia. (s.f.). Obtenido de
[Link]
Learn Tutorials. (s.f.). Obtenido de
[Link]
Medium. (s.f.). Obtenido de [Link]
instrucciones-imprescindibles-para-crear-un-dockerfile-bb439ff836d9
Oracle-Base. (s.f.). Obtenido de [Link]
default-redirect
Programmer Click. (s.f.). Obtenido de
[Link]
Programmer Click. (s.f.). Obtenido de Permisos de configuración de Tomcat:
[Link]
[27]