OpenJDK + Liferay + MySQL, en contenedores

 

Estamos en el mundo de la contened.. conteneni...contenedoriza... bueno, que todo lo colocan en contenedores. Lo cual es un gran alivio en la configuración y puesta en producción de servidores. No tendríamos de qué preocuparnos más que esté bien configurado a través de un archivo YAML.

Una de los temas más recurrentes que he hablado en este humilde blog es sobre el CMS hecho en Java llamado Liferay. Siempre la parte que más me preocupaba era: ¿cómo diablos podemos ponerlo en producción con algunos pasos?. Pues bueno, aquí lo explico en este post: usando Docker.

Pues bien, aquí explicaré desde lo básico hasta lo más complejo:

Antes que nada, debemos tener instalado el docker en nuestro computador.

1. Lo más básico: Un Liferay para demo.

Si revisamos la página de imágenes para Liferay (en este link https://hub.docker.com/r/liferay/portal) bastaría con hacer pull a la imágen y lo ponemos a funcionar. Es buena manera, pero aquí aprenderemos a hacerlo con mejor estilo.

En una carpeta en blanco, crearemos el siguiente archivo docker-compose.yml con el siguiente contenido:

version: '3.8'
services:
    liferay-7.4:
        image: liferay/portal:7.4.3.8-ga8
        environment:
            JAVA_VERSION: zulu11
        ports:
            - '8000:8080'
        deploy:
            resources:
                limits:
                    memory: 8g     



Estoy usando la última versión del Liferay disponible hasta este momento. Para más versiones, revisar los tags disponibles: https://hub.docker.com/r/liferay/portal/tags

Además, según la documentación, se puede indicar qué versión de Java se puede utilizar. Eso lo hacemos con la variable de entorno JAVA_VERSION

Notemos, también, que estamos exportando el puerto 8080 al puerto 8000. Así que, si tenemos alguna otra aplicación funcionando en el puerto 8080, no entrará en conflico.

Ejecutemos esta configuración con este comando:

docker-compose -f docker-compose.yml up

Esperemos que cocine, y veamos los resultados: 

(Descargando la imagen por primera vez:)


 Después de cargar comienza a ejecutarse:



Y después de un tiempo,ya podemos acceder a la web. Como lo hemos publicado en el puerto 8000, escribiremos en nuestro navegador http://localhost:8000


Como lo estamos ejecutando "de caja", entonces la base de datos utilizada es H2.

2. Configurando volúmenes.

Liferay se puede configurar accediendo a ciertas carpetas. Además, todo lo que configuremos en la aplicación se perderá en algún momento. Entonces, es necesario poner a disposición ciertas carpetas "perpetuas" para la configuración. Por ejemplo, la carpeta para desplegar las aplicaciones, los archivos de configuración, entre otras. Así que, detengamos nuestro Docker, y modifiquemos el archivo con lo siguiente:

version: '3.8'
services:
    liferay-7.4:
        image: liferay/portal:7.4.3.8-ga8
        environment:
            JAVA_VERSION: zulu11
        ports:
            - '8000:8080'
        deploy:
            resources:
                limits:
                    memory: 8g                    
        volumes:
            - ./mnt:/mnt/liferay
            - ./liferay/osgi/modules:/opt/liferay/deploy


Estamos considerando dos carpetas: mnt y liferay. Estas deben existir en la carpeta donde hemos colocado nuestro archivo .yml.

3. Base de datos

Ahora, necesitamos incorporar la base de datos. Usaremos MySQL 8. Así que escribiremos lo siguiente en el archivo docker-compose.yml:
version: '3.8'
services:
    liferay-7.4:
        depends_on:
- mysql.8
image: liferay/portal:7.4.3.8-ga8 environment: JAVA_VERSION: zulu11 ports: - '8000:8080' deploy: resources: limits: memory: 8g volumes: - ./mnt:/mnt/liferay - ./liferay/osgi/modules:/opt/liferay/deploy networks: - lifenet mysql.8: container_name: mysql_liferay image: mysql:latest environment: MYSQL_ROOT_PASSWORD: root TZ: America/Lima MYSQL_USER: lportal MYSQL_PASSWORD: lportal ports: - '23306:3306' volumes: - ./mysql-volumes:/var/lib/mysql networks: - lifenet networks: lifenet:

Pasaré a explicar cada línea:
  • Línea 4: Depende del servicio MySQL que está más abajo.
  • Línea 34: Aquí defino el nombre de la red que utilizaré en mis servicios. Se llamará lifenet. Se utilizará en la línea 19 para el servicio de Liferay, y en la línea 33 que es el servicio de MySQL.
  • Línea 20: Creo mi servicio con el nombre mysql.8.
  • Línea 21: El nombre del contenedor. OJO con este nombre, porque será el nombre del HOST que será visible en nuestros servicios.
  • Línea 22: Usaremos la última versión de MySQL.
  • Línea 23 al 27. Voy a definir variables de entornos. Estos están preparados para que se configuren el MySQL al iniciarse por primera vez. La línea 22 es la contraseña del ROOT, la línea 23 es para la zona horaria (he colocado mi ciudad), y las líneas 24 y 25 son el usuario predeterminado con su respectiva contraseña.
  • Línea 28,29: Defino el puerto para poder acceder del MySQL. MySQL utiliza el 3306, así que lo publico por el 23306.
  • Línea 30: También creo sus volúmenes. Así quedará persistente la base de datos. Ojo, hay que crear también la carpeta mysql-volumes en la carpeta donde tenemos el archivo .yml.

Y listo, levantamos el docker y veremos qué pasa. 


Veremos cómo descarga la imagen de MySQL y también que se levanta el Liferay. Esto es normal porque lo habíamos puesto así. Lo que nos falta ahora es hacer que ambos se vean. Pero antes, hay que preparar la base de datos. 

Así que, desde cualquier cliente de MySQL accederemos al puerto 23306 con el usuario root y la contraseña root. Yo lo mostraré desde la línea de comandos.

mysql -u root -P 23306 -p

Ahora, desde aquí, crearemos la base de datos lportal, y asignaremos el usuario lportal a esa base de datos:

create database lportal;
grant all on lportal.* to lportal@"%";

 


Ahora bien, podemos salir de la base de datos y probar el inicio de sesión entrando con ese usuario:

mysql -u lportal -p -P 23306
Y desde ahí, podemos ver las bases de datos que puede ver el usuario:
show databases;

 

Bien, podemos ver la base de datos creada para el usuario lportal, y este usuario puede verlo. Ahora, vamos a detener el docker y configuremos ciertos archivos del Tomcat de Liferay para que se conecten.

4. Configuración del Tomcat para que acceda al MySQL

Desde la carpeta donde se encuentra el .yml crearemos la siguiente ruta de carpetas: mnt/files/tomcat/conf y en esta carpeta conf crearemos un archivo llamado context.xml que contendrá el siguiente texto:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Resource
        name="jdbc/LiferayPool"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://mysql_liferay:3306/lportal?characterEncoding=UTF-8&dontTrackOpenResources=true&holdResultsOpenOverStatementClose=true&serverTimezone=America/Lima&useFastDateParsing=false&useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false"
        username="lportal"
        password="lportal"
        maxTotal="100"
        maxIdle="30"
        maxWaitMillis="10000"
    />
	
</Context>

Observar la línea 11. El nombre del host es justamente el nombre del host que hemos creado en el archivo .yml: mysql_liferay. Además se utilizará el puerto por omisión de MySQL porque ambos están en la misma red.

Ok, con esto hemos configurado el Tomcat para que se conecte a la base de datos de MySQL y esté como un DataSource. Ahora nos toca activar el Liferay para que utilice esta conexión.

5. Configuración del Liferay para acceder al DataSource de Tomcat.

Ahora, nos ubicamos en la carpeta ./mnt/files y creamos el archivo portal-ext.properties con el siguiente contenido:

include-and-override=portal-developer.properties
jdbc.default.jndi.name=jdbc/LiferayPool

Listo, guardamos todo y levantamos el docker-compose.yml.

Veremos que utilizará el dialecto MySQL, y comenzará a crear todas las tablas necesarias.


Y listo, ya tenemos nuestro entorno bien configurado para comenzar a utilizar.

 Si te gustó la publicación, coméntalo en la caja de abajo. Si te es útil, compártelo que es gratis. Si deseas que haga un vídeo de esto, también coméntalo abajo.



Comentarios

  1. Muy interesante, aunque para llevarlo a la practica en Docker para Windows 4.4 he tenido cambiar la URL de conexión a MySQL, dejandolo unicamente en ...characterEncoding=UTF-8". Si incluyo algo mas me falla.

    ResponderBorrar

Publicar un comentario

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/

Entradas más populares de este blog

UML en NetBeans

Cambiar ícono a un JFrame

RESTful... la forma más ligera de hacer WebServices (Parte 1)