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

Así funciona IPv6: configuración en router Linux y Cisco

IPv6 es una actualización del protocolo IPv4 que nace ante la escasez de direcciones que IPv4 permite. Las direcciones IPv6 están formada por 32 caracteres hexadecimales en grupos de cuatro caracteres separados por el carácter dos puntos (:). En este post se recogen varios ejemplos prácticos del funcionamiento de este protocolo.

Leer

Configurar redes virtuales (VLAN) en bridges Linux

Este post pretende demostrar el funcionamiento y guiar en la configuración de redes virtuales en un bridge creado en una máquina Debian.

Leer

Despliegue de una aplicación PHP en Kubernetes

En este post se documenta el despliegue de la aplicación Let`s Chat en Kubernetes.

Leer