Implantación de una aplicación Java usando Docker
- Francisco Javier Huete
- Implantacion
- February 10, 2025
Í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