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.