martes, 5 de julio de 2016

Instalación de Geoserver en Docker

Hace unos días encontré los archivos de mi proyecto final de carrera. Consistía en una aplicación web programada en JavaScript que usaba Geoserver y la API de Google Maps. La aplicación permitía dibujar un conjunto de puntos, líneas y áreas sobre un mapa de Google Maps y posteriormente guardarlas mediante WFS-Transaccional en Geoserver.

Para poder usarla, se ha de instalar como una webapp en Geoserver. Así que pensé que seria interesante instalar Geoserver en un contenedor Docker.


Introducción
Geoserver es un servidor de mapas (tanto vectoriales como raster) programado en Java y que permite a los usuarios compartir y editar datos geoespaciales. Constituye la implementación de referencia del Open Geospatial Consortium ( OGC ).

Docker es un servidor de contenedores que reduce la complejidad de las maquinas virtuales. No es necesario virtualizar un sistema operativo completo, sino que se crean unos contenedores aislados del sistema operativo huésped y dentro de los cuales se instalan las dependencias que no estén suministradas por el sistema operativo huésped.

Una vez instalado Docker con el gestor de paquetes de la distribución que estemos usando, se puede realizar una prueba rápida para comprobar que todo funciona correctamente.

$ docker run hello-world

Este comando descarga una pequeña imagen de prueba y la ejecutará. Si todo funciona correctamente, la salida que dará es la siguiente:

Hello from Docker.
This message shows that your installation appears to be working correctly.
...

La instalación de Docker la he realizado en Linux Mint 17.2 (basado en Ubuntu) y han surgido  varios errores. Estos errores se solucionan instalando varias dependencias que necesita Docker.

Los errores mostrados al ejecutar docker run hello-world y su solución son los siguientes:
FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

Se ha de instalar apparmor
$ sudo apt-get install apparmor

Si apparmor no se está ejecutando, se ha de iniciar:
$ sudo service apparmor start
A continuación de ha de iniciar docker
$ sudo service docker start

Otro posible error es:
FATA[0000] Error response from daemon: Cannot start container a6bcc1ede2c38cb6b020cf5ab35ebd51b64535af57fa44f5966c37bdf89c8781: [8] System error: mountpoint for devices not found
Si se revisan los archivos log del sistema (/var/log/upstart/docker.log) :
ERRO[0617] Couldn't run auplink before unmount: exec: "auplink": executable file not found in $PATH

La solución consiste en instalar aufs-tools y reiniciar docker.
$ sudo apt-get install aufs-tools
También se han de instalar  cgroup-lite
$ sudo apt-get install cgroup-lite
Una vez instalados las dependencias, se puede ejecutar la imagen hello-world sin problemas.

Instalación de Geoserver

Para automatizar la instalación de Geoserver en de Docker (o cualquier otro software que nos interese), se pueden usar Dockerfiles. Son archivos de texto que Docker utiliza para la instalación y configuración de Geoserver y sus dependencias.

# Pull base image
FROM ubuntu:16.04

# Install Ubuntu packages
RUN \
 apt-get update && \
 apt-get install -y software-properties-common unzip wget

# Install  Java
RUN \
 echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
 add-apt-repository -y ppa:webupd8team/java && \
 apt-get update && \
 apt-get install -y oracle-java8-installer && \
 rm -rf /var/lib/apt/lists/* && \
 rm -rf /var/cache/oracle-jdk8-installer

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

#
# Geoserver installation
# Stable version on 2016-06-14 is 2.9.0
#
ENV GEOSERVER_VERSION 2.9.0
ENV GEOSERVER_HOME=/usr/share/geoserver

# Get Geoserver
RUN mkdir $GEOSERVER_HOME
RUN wget http://ares.boundlessgeo.com/geoserver/release/$GEOSERVER_VERSION/geoserver-$GEOSERVER_VERSION-bin.zip
RUN cp geoserver-$GEOSERVER_VERSION-bin.zip $GEOSERVER_HOME
RUN unzip $GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION-bin.zip -d $GEOSERVER_HOME
RUN rm $GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION-bin.zip

# Get a Geoserver Plugin
RUN wget http://ares.boundlessgeo.com/geoserver/release/$GEOSERVER_VERSION/plugins/geoserver-$GEOSERVER_VERSION-printing-plugin.zip
RUN cp geoserver-$GEOSERVER_VERSION-printing-plugin.zip $GEOSERVER_HOME
RUN unzip $GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION-printing-plugin.zip -d $GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION/webapps/geoserver/WEB-INF/lib/
RUN rm $GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION-printing-plugin.zip

# Define Geoserver env
ENV GEOSERVER_HOME=$GEOSERVER_HOME/geoserver-$GEOSERVER_VERSION
WORKDIR $GEOSERVER_HOME/bin

# Expose GeoServer's default port
EXPOSE 8080

A continuación se puede construir la imagen usando el archivo dockerfile y ejecutar el contenedor Docker. (Es importante el punto a continuación de :test ).

$ docker build -f dockerfile.txt -t user/geoserver-master:test .
$ docker run -it --net="host" user/geoserver-master:test

Si al construir la imagen se obtiene el error:
/bin/sh: 1: add-apt-repository: not found
Se ha de modificar el archivo dockerfile  y cambiar software-properties-common por python-software-properties. Dependiendo de la versión de Ubuntu se ha usado uno u otro paquete.

El comando docker run  abrirá una sesión en bash pero ejecutándose dentro del contenedor Docker y directamente dentro del directorio definido por la última línea del fichero Dockerfile. Esto permite ejecutar Geoserver mediante:
$ ./startup.sh

Una vez Geoserver esté en funcionamiento, se puede acceder al panel de administración mediante un navegador web y la URL localhost:8080/geoserver . El usuario y contraseña por defecto de Geoserver son : admin / geoserver.

No hay comentarios:

Publicar un comentario