WAR to Docker. Containerized GIS

GeoWE corriendo en Docker






Parece que en las últimas semanas me persigue una ballena cargada de contenedores. Docker por aquí, Docker por allí, Docker esto, Docker lo otro.   Hace años que empezaba a leer sobre los beneficios de usar contenedores, tanto en desarrollo como en producción, y no se porqué últimamente me está "azotando" insistentemente, quizá sea que el grado de madurez de esta tecnología está alcanzando un punto álgido, o quizá es porque está de moda, o tal vez que alguna de las personas que me rodean acaba de descubrir los contenedores, y ha encontrado un nuevo martillo. Quién sabe, la cuestión es que llevaba bastantes meses sin escribir un post, y me ha parecido una buena idea dedicarle un ratito a Docker. 

No me voy a poner a describir las bondades de los contenedores, (para eso ya hay mucha literatura). Voy  a centrar el post en un caso práctico, "Dockerizar" mi SIG Web. Como se puede ver en la imagen el objetivo ha sido "meter" GeoWE en un contenedor, un Sistema de Información Geográfica, del que ya he escrito en otras ocasiones.

Bueno, pues manos a la obra. voy a intentar ser breve, listando los pasos que he seguido:
  • Instalar Docker

No creo que a estas alturas tenga que describir como instalar Docker. Yo me he guiado por la documentación oficial, sin ningún problema. En el post Comenzando con Docker de aguasnegras.com se explica muy bien.
  • Compilar GeoWE

Para obtener el WAR de GeoWE lo mejor es compilarlo, partiendo de su código fuente en Github. Esto ya lo describí en el post Montando mi SIG Web con GeoWE, por tanto no me voy a repetir. Seguimos las instrucciones (configuración maven, descarga proyecto y mvn package), y obtenemos nuestro magnífico geowe.war. Por supuesto no es necesario montar Tomcat ni los extras que explicaba en el post.


  Recuerda: GeoWE es de código abierto, si quieres puedes cambiarlo a tu antojo.


  • Construir la imagen de Docker

Para construir la imagen de Docker voy a necesitar crear el fichero Dockerfile. Por abreviar he usado una imagen de tomcat 8, pero puedes mirar caulquier otra imagen que te resulte de interés en docker-library.

El fichero Dockerfile que he usado queda así:

  FROM tomcat:8.0.43-jre8
  ADD geowe.war /usr/local/tomcat/webapps/
  EXPOSE 8080
  CMD chmod +x /usr/local/tomcat/bin/catalina.sh
  CMD ["catalina.sh", "run"]


Una vez tengo el Dockerfile definido procedo a construir la imagen ejecutando:
  $ sudo docker build - . < Dockerfile

Compruebo que la imagen se ha creado ejecutando:
  $ sudo docker images

¡Upss! se me ha olvidado ponerle un tag a la imagen. Siempre es mejor identificar amigablemente, así que:
  $ sudo docker tag cce3afdcdcc7 geowe-1.5

Ahora ya me gusta más:
  $ sudo docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
geowe-1.5           latest              cce3afdcdcc7        6 hours ago         485MB
tomcat              8.0.43-jre8         03fc9c4ee243        22 months ago       367MB

 
  • Ejecutar el contenedor

Con la  imagen creada, incluyendo el war de GeoWE, es hora de probarlo. Ejecutamos el contenedor:
  $ sudo docker run -i -t -d -p 8080:8080 geowe-1.5  

-i: interactivo
-t: Asigno un pseudo-TTY
-d: ejecuto en segundo plano
-p: publico el puerto

Hora de abrir el navegador y acceder a la aplicación: http://localhost:8080/geowe

GeoWE en el contenedor: http://localhost:8080/geowe

Si queremos visualizar las estadísticas de uso del contenedor (como se ve ne la primera imagen):
  $ sudo docker container stats


Pues eso es todo... o ¿no?

Paremos el contenedor:
  $ sudo docker stop cce3afdcdcc7

y vamos a guardar nuestra imagen
  $ sudo docker image save -o geowe-docker-img.tar geowe-1.5

para llevárnosla a donde nos plazca y ejecutarla en otro sitio:  
  $ docker load -i geowe-docker-img.tar
 
 La imagen ocupa aproximadamente 480MB. Para un SIG en el bolsillo, no está mal.

Ahora si, ¡ya está!

Umm.. o ¿no? venga si, ya lo dejo. Pero estaría bien preparar la imagen y publicarla en Docker Hub.

También estaría genial integrar el proceso manual descrito en este post, en un sistema de CI/CD, con Kubernetes, pero eso es tema de otro post.





Comentarios

Rafael López ha dicho que…
@agustinventura me comenta lo siguiente, para el Dockerfile:
"deberías usar copy, de hecho recomiendan usar siempre copy,add es poco seguro.
(add automáticamente hace lindezas como descomprimir)"

https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockeril

Gracias por el aporte!!