Implantación de una aplicación Java usando Docker

Índice

Para implantar una aplicación Java usando Docker se puede compilar una aplicación desde el código fuente o usar un fichero ya compilado. Además, se puede implantar una aplicación en un contenedor tomcat o crear una imagen Docker propia a partir de una imagen Tomcat con las modificaciones necesarias para servir la aplicación.

Compilar la aplicación desde el código fuente

Para poder compilar una aplicación Java a partir de su código fuente se puede usar la herramienta maven.

apt install maven

Esta herramienta permite generar proyectos de Java y compilarlos para generar el fichero desplegable a partir de la estructura de directorios del proyecto de la aplicación.

En este caso, se descarga el código fuente de un aplicación sencilla escrita en Java desde su repositorio en GitHub.

git clone https://github.com/josedom24/rock-paper-scissors.git

Después, con la herramienta maven se compila el código para generar el fichero .war desde la raíz del proyecto.

mvn clean package

En el directorio target del proyecto se genera el fichero .war que permite desplegar la aplicación. Tradicionalmente, esto se haría copiando este fichero en el directorio /var/lib/tomcat10/webapps/ del servidor de aplicaciones. En este caso, se usa un contenedor Docker con Tomcat para desplegar la aplicación.

Despliegue manual de una aplicación sencilla en Docker

Para desplegar de forma manual una aplicación Java en Docker se necesita un contenedor con un servidor de aplicaciones Java instalado, por ejemplo, Tomcat.

docker run -d -p 8082:8080 -e TOMCAT_USERNAME=admin -e TOMCAT_PASSWORD=admin --name tomcat bitnami/tomcat:9.0

Al acceder al puerto 8082 del equipo en el que se ha creado el contenedor con el servidor de aplicaciones Tomcat, desde la URL /manager/html se pueden gestionar las aplicaciones instaladas. También desde la interfaz gráfica del administrador se pueden desplegar aplicaciones.

Otra opción para desplegar una aplicación en este Tomcat es copiar el fichero desde el anfitrión del contenedor al directorio de despliegue /opt/bitnami/tomcat/webapps. Para facilitar este paso, el contenedor cuenta con el directorio /app, que es un enlace simbólico al directorio de despliegue, de manera que las aplicaciones que se copien a este directorio también se desplegarán en el servidor de aplicaciones.

docker cp rock-paper-scissors/target/roshambo.war tomcat:/app

Tras copiar el fichero al directorio indicado en el contenedor, se puede acceder a la aplicación entrando al puerto 8082 de la máquina en la que está instalado el contenedor y, en este caso, a la ruta /roshambo.

Creación de la imagen Docker de una aplicación Java

De forma más avanzada, se puede desplegar también una aplicación Java creando una imagen nueva a partir de un contenedor con Tomcat junto a otro contenedor con una base de datos para almacenar la información de la aplicación. En este caso, se despliega la aplicación OpenCMS. Esta aplicación ofrece su fichero de despliegue .war ya compilado.

wget http://www.opencms.org/downloads/opencms/opencms_8.0.4.zip
apt install unzip
unzip opencms_8.0.4.zip

Para crear la imagen de la aplicación, se parte de la imagen Docker de Tomcat y se copia el fichero de despliegue .war de la aplicación en el directorio de despliegue que se indica en la documentación de la imagen Docker.

FROM bitnami/tomcat:9.0
COPY app/opencms.war /opt/bitnami/tomcat/webapps

A partir de este Dockerfile se puede generar una imagen Docker que despliegue la apliación.

docker build -t fjhuete/opencms:v1 .

Usando esta imagen junto a una imagen de MariaDB como base de datos se puede desplegar OpenCms con un fichero docker-compose como este:

services:
  app:
    container_name: opencms
    image: fjhuete/opencms:${VERSION_OPENCMS}
    restart: always
    environment:
      TOMCAT_USERNAME: ${TOMCAT_USERNAME}
      TOMCAT_PASSWORD: ${TOMCAT_PASSWORD}
    ports:
      - ${PUERTO}:8080
    depends_on:
      - db
    networks:
      red:
  db:
    container_name: opencms_db
    image: mariadb:latest
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    networks:
      red:
    volumes:
      - data:/var/lib/mysql
volumes:
    data:
networks:
  red:
    name: red_opencms
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "172.23.0.0/16"

En este fichero se define una red docker específica para la aplicación para evitar que la red que genera por defecto Docker al ejecutar un docker compose up puede interferir con la red local de la máquina anfitriona.

Para desplegar la aplicación a partir del fichero se usa el comando docker compose.

docker compose up -d

El gestor de contenidos se puede configurar accediendo a la dirección IP de la máquina anfitriona en el puerto 8081 y añadiendo a la URL /opencms/steup/.

Tras configurar la aplicación, se puede acceder en el puerto 8081 de la IP de la máquina anfitriona con la URL /opencms/opencms/index.html.

Acceso a las aplicaciones usando un proxy inverso

Para configurar el proxy inverso que permita acceder a las aplicaciones se usa, en este caso, un contenedor Nginx. Para configurar el servidor web como proxy inverso se crea este contenedor con la opción bind mount, de manera que se monta un fichero de configuración del equipo anfitrión en el directorio de configuración del contenedor.

Antes de crear el contenedor, se configura el proxy inverso en el fichero en el equipo anfitrión.

server {
    listen       80;
    listen  [::]:80;
    server_name  java.javi.org;

    location / {
	    rewrite ^/$ /opencms/opencms/ redirect;
}

    location /opencms/ {
    	proxy_pass http://172.22.200.203:8081/opencms/;
    }
    
    location /game {
	    proxy_pass http://172.22.200.203:8082/roshambo/;
    }
}

Para ejecutar el contenedor nginx como proxy inverso usando este fichero de configuración se usa el siguiente comando:

docker run -d -p 80:80 -v ./default.conf:/etc/nginx/conf.d/default.conf:ro --name proxy-inverso nginx
comments powered by Disqus

Relacionados

Creación y configuración de un sistema de ficheros en Debian 12

En este post se plantea un caso práctico en el que se emplean varios comandos para la configuración de sistemas de ficheros en Debian. En concreto, se trata de un ejemplo en el que se instala Debina 12 en una máquina con recursos limitados en VirtManager y, posteriormente, se amplía el espacio de almacenamiento añadiendo un nuevo disco duro y clonando el sistema en él.

Leer

Configuración NAT en routers Cisco en GNS3

NAT (Network Address Translation o traducción de direcciones de red) es un mecanismo que consiste en modificar la información de direccionamiento en los paquetes IP que atraviesan un router. En este post se muestra un ejemplo de configuración de este mecanismo en un escenario de GNS3.

Leer

Guía de instalación de MongoDB en Debian 12

En esta guía se resumen los pasos esenciales para instalar MongoDB en Debian 12 de manera sencilla.

Leer