Dockerizando Wildfly

por | julio 21, 2018

Tenía pendiente desde hace un tiempo escribir sobre dockers y contenedores en general. Le ha llegado el turno a Wildfly, versión comunitaria de Jboss. Vamos a ver cómo crear una imagen personalizada, echarla a correr y mantener persistencia de datos del contenedor guardando los logs de la instancia en nuestro host.

Descarga de la imagen del docker Wildfly

Este paso es opcional ya que al construir nuestra imagen basada en el fichero Dockerfile se descargará la imagen base si no la tenemos en nuestro repositorio. Voy a descargar en concreto la versión 12.0.0.Final de la imagen oficial, por lo que utilizo el tag correspondiente:

sudo docker pull jboss/wildfly:12.0.0.Final

Ejemplo:

jota@mid-dockers:~/dockerfiles/wildfly-example-war$ sudo docker pull jboss/wildfly:12.0.0.Final
[sudo] password for jota: 
Using default tag: latest
latest: Pulling from jboss/wildfly:12.0.0.Final
469cfcc7a4b3: Pull complete 
05677e4d61f0: Pull complete 
a9520f492457: Pull complete 
4d201219d6b1: Pull complete 
01710aba802b: Pull complete 
Digest: sha256:01c15a87ea50a9e515af9b419491bd0f45e37fdedbd7bde33485d701a74783d2
Status: Downloaded newer image for jboss/wildfly:12.0.0.Final

Fichero Dockerfile

Aquí especificamos cómo vamos a construir nuestra imagen personalizada. Para este ejemplo las distintas órdenes son bastante intuitivas, pero tenéis una guía oficial de referencia.

Para mi imagen busco la siguiente personalización:

  • Creación de un usuario administrativo con el que poder conectar y administrar la instancia de Jboss.
  • Añadir el paquete example.war a la imagen. Este paquete se desplegará al arrancar el contenedor.
  • Configuración personalizada de la instancia. Esta configuración se leerá de un fichero standalone.xml que copiaré a la imagen.

Para trabajar con Dockerfiles lo que hago es crearme un directorio de trabajo por cada Dockerfile para tenerlo todo bien organizado. Así para este caso creo el directorio wildfly-example-dockerfile y dentro de este directorio tengo los siguientes ficheros:

standalone.xml
example.war
Dockerfile

El fichero Dockerfile tiene el siguiente contenido:

# Base image
FROM jboss/wildfly:12.0.0.Final

# Maintainer
MAINTAINER "Jota" "mail@example.com"

# Create user jota with password jota1234
RUN /opt/jboss/wildfly/bin/add-user.sh jota jota1234 --silent

# Add custom configuration file
ADD standalone.xml /opt/jboss/wildfly/standalone/configuration/

# Add example.war to deployments
ADD example.war /opt/jboss/wildfly/standalone/deployments/

# JBoss ports
EXPOSE 8080 9990 8009

# Run
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone.xml"]

Una vez tengo todo listo construyo mi imagen con docker build. Atención al punto del final que indica dónde estamos construyendo la imagen (directorio actual):

sudo docker build -q --rm --tag=jboss/wildfly:12.0.0.Final-example-war .

Ahora si listo las imágenes con docker images veo la que acabo de crear:

jota@mid-dockers:~/dockerfiles/wildfly-example-war$ sudo docker images
REPOSITORY          TAG                        IMAGE ID            CREATED              SIZE
jboss/wildfly       12.0.0.Final-example-war   901550939ee8        About a minute ago   630MB
firehol/netdata     latest                     9116c7c5e4a8        3 days ago           276MB
wordpress           latest                     1d3cc82944da        8 days ago           408MB
mysql               5.7                        66bc0f66b7af        9 days ago           372MB
mysql               latest                     8d99edb9fd40        9 days ago           445MB
httpd               latest                     2a7d646dbba8        9 days ago           178MB
jboss/wildfly       latest                     347d86a67430        4 weeks ago          653MB
jboss/wildfly       12.0.0.Final               317d234e0103        2 months ago         630MB
jboss/wildfly       11.0.0.Final               6926d48f2e5b        2 months ago         617MB
friendlyhello       latest                     a29c44471513        3 months ago         150MB
python              2.7-slim                   55d87c387a8c        3 months ago         139MB
hello-world         latest                     f2a91732366c        7 months ago         1.85kB

Ejecutando nuestro contenedor docker

Ya tenemos nuestra imagen y podemos ejecutarla en un contenedor docker.

Para una primera prueba, la podemos levantar de la siguiente manera, en primer plano:

sudo docker run -p 8080:8080 -p 9990:9990 -p 8009:8009 \
--name wildfly-example -it jboss/wildfly:12.0.0.Final-example-war

Veremos la salida de consola de Wildfly mientras arranca.

Si queremos ejecutar el docker en segundo plano utilizaremos la opción -d (detached):

sudo docker run -d -p 8080:8080 -p 9990:9990 -p 8009:8009 \
--name wildfly-example -it jboss/wildfly:12.0.0.Final-example-war

Ahora podremos visitar la página y ver la aplicación de ejemplo. En mi caso la IP del servidor donde ejecuto los dockers es 192.168.1.154:

http://192.168.1.154:8080/example/

Guardando los logs de forma persistente

¿Y si quisiera guardar los logs de forma persistente? Ahora mismo si paro mi contenedor pierdo todo el contenido… Podemos lograrlo mapeando el sistema de ficheros del docker con el host con la opción -v (volumen), de manera que se escriba en el directorio /var/log/jboss/example de nuestro host el contenido del contenedor /opt/jboss/wildfly/standalone/log.

sudo docker run -p 8080:8080 -p 9990:9990 -p 8009:8009 \
-v /var/log/jboss/example:/opt/jboss/wildfly/standalone/log \
--name wildfly-example -it jboss/wildfly:12.0.0.Final-example-war

Ahora paramos el docker:

sudo docker stop wildfly-example

Vemos que el log es persistente y de hecho Wildfly habrá parado de forma ordenada cuando ordenamos parar al contenedor:

jota@mid-dockers:/var/log/jboss$ tail server.log 
2018-07-06 10:12:44,917 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) WFLYJCA0010: Unbound data source [java:jboss/datasources/ExampleDS]
2018-07-06 10:12:44,924 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) WFLYJCA0019: Stopped Driver service with driver-name = h2
2018-07-06 10:12:44,928 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 65) WFLYCLINF0003: Stopped client-mappings cache from ejb container
2018-07-06 10:12:44,941 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0008: Undertow HTTP listener default suspending
2018-07-06 10:12:44,942 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0007: Undertow HTTP listener default stopped, was bound to 0.0.0.0:8080
2018-07-06 10:12:44,941 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0008: Undertow HTTPS listener https suspending
2018-07-06 10:12:44,942 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment example.war (runtime-name: example.war) in 67ms
2018-07-06 10:12:44,944 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0007: Undertow HTTPS listener https stopped, was bound to 0.0.0.0:8443
2018-07-06 10:12:44,945 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-3) WFLYUT0004: Undertow 2.0.0.Final stopping
2018-07-06 10:12:44,950 INFO  [org.jboss.as] (MSC service thread 1-4) WFLYSRV0050: WildFly Full 12.0.0.Final (WildFly Core 4.0.0.Final) stopped in 73ms

Para artículos posteriores creo que me voy a crear un repositorio en GitHub donde ir subiendo los ficheros Dockerfile para los distintos servicios que voy dockerizando. En mente: Jboss EAP, Apache, Nginx, MySQL y WordPress.

Por cierto, a modo informativo en la web de Red Hat tenéis una sección dedicada a dockers para proyectos de Jboss que os puede interesar.