Despliegue de aplicaciones Java mediante Dockerfile

Configuración previa de red

Antes de exponer la aplicación al tráfico externo, es fundamental configurar el firewall del sistema operativo (en distribuciones basadas en RHEL/CentOS) para permitir las conexiones en el puerto deseado.

# Permitir tráfico en el puerto 8080 de forma permanente
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# Aplicar los cambios en el firewall
firewall-cmd --reload

# Verificar la configuración actual del puerto
firewall-cmd --zone=public --query-port=8080/tcp

# Eliminar la regla en caso de ser necesario
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

Estructura del Dockerfile

El siguiente Dockerfile define el entorno necesario para ejecutar un archivo JAR de Java. Se utiliza una imagen base ligera de OpenJDK 8 y se configura la zona horaria para asegurar la consistencia en los logs.

# Imagen base con el entorno de ejecución de Java 8
FROM openjdk:8-jre-slim

# Definición de variables de entorno para rutas
ENV APP_HOME=/usr/src/app
ENV TZ=America/Mexico_City

# Configuración de la zona horaria del sistema
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Creación del directorio de trabajo
WORKDIR ${APP_HOME}

# Copia del artefacto ejecutable al contenedor
# Se asume que el archivo .jar se encuentra en el mismo directorio que el Dockerfile
COPY app-service.jar web-app.jar

# Definición de variables para la configuración de memoria y puertos
ENV MEM_OPTS="-Xmx512m -Xms256m"
ENV APP_PORT=8080

# Exposición del puerto de red
EXPOSE ${APP_PORT}

# Comando de arranque optimizado para entornos de contenedores
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "web-app.jar", "--server.port=8080"]

Script de automatización para construcción y despliegue

Para agilizar el ciclo de vida de la imagen, se puede emplear un script en Bash que gestione la eliminación de contenedores previos, la compilación de la nueva imagen y su ejecución inmediata.

#!/bin/bash

# Solicitar metadatos al usuario
echo "Configuración de despliegue de imagen Docker"
read -p "Nombre del servicio: " SERVICE_NAME
read -p "Etiqueta de versión (ej. 1.0.0): " TAG_VERSION
read -p "Puerto de escucha del host: " HOST_PORT

FULL_IMAGE_NAME="${SERVICE_NAME}:${TAG_VERSION}"

echo "Iniciando proceso para: ${FULL_IMAGE_NAME}"

# Eliminar imagen previa si existe para liberar espacio
docker rmi -f ${FULL_IMAGE_NAME} 2>/dev/null

# Construcción de la nueva imagen
docker build -t ${FULL_IMAGE_NAME} .

# Detener y remover contenedores activos con el mismo nombre
echo "Limpiando contenedores antiguos..."
docker stop ${SERVICE_NAME} 2>/dev/null
docker rm ${SERVICE_NAME} 2>/dev/null

# Ejecución del nuevo contenedor
echo "Lanzando contenedor en puerto ${HOST_PORT}..."
docker run -d \
  --name ${SERVICE_NAME} \
  -p ${HOST_PORT}:8080 \
  -e TZ="America/Mexico_City" \
  --restart unless-stopped \
  ${FULL_IMAGE_NAME}

echo "Despliegue finalizado con éxito."

Gestión de limpieza de recursos

En entornos de desarrollo es común necesitar la eliminación completa de los artefactos generados. El siguiente script facilita la limpieza por nombre de contenedor o ID.

#!/bin/bash

read -p "Ingrese el ID o nombre del contenedor/imagen a eliminar: " TARGET_ID

if [ -z "$TARGET_ID" ]; then
    echo "No se proporcionó un identificador válido."
    exit 1
fi

echo "Deteniendo contenedor..."
docker stop ${TARGET_ID}

echo "Removiendo contenedor..."
docker rm ${TARGET_ID}

echo "Borrando imagen del repositorio local..."
docker rmi ${TARGET_ID}

echo "Operación de limpieza completada."

Etiquetas: Docker dockerfile java spring-boot bash

Publicado el 6-20 23:21