Trabajar con elasticsearch mediante docker

Trabajar con elasticsearch, sobre todo para entornos de pruebas, es mucho más fácil con el contenedor Docker que Elasticseacrh nos facilita.

Las ventajas del uso de contenedores es evidente, fácil portabilidad, bajo uso de recursos, etc. Por ello, muchas de las grandes empresas de software están creando este tipo de contenedores para facilitar la implementación de sus productos.

Descarga del contendor de Elasticsearch

En el caso de Elasticsearch, podemos obtener este contenedor fácilmente desde el propio hub de Docker. Para descargarlo en nuestra máquina solo tendremos que ejecutar el siguiente comando.

docker pull docker.elastic.co/elasticsearch/elasticsearch:X.XX.X

Sustituiremos X.XX.X por el número de versión que deseemos instalar.

Podemos ver las versiones disponibles en está página de Elasticsearch (https://www.docker.elastic.co/r/elasticsearch). Tambien podes ver las versiones disponibles, desde la propia página del hub de docker (https://hub.docker.com/_/elasticsearch?tab=tags)

Para descargar la ultima versión disponible en el momento de escribir este post, tendríamos que ejecutar el siguiente comando.

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Una vez que ha concluido la descarga y la instalación

$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.4
7.13.4: Pulling from elasticsearch/elasticsearch
ddf49b9115d7: Pull complete
67831602c5f6: Pull complete
e9244a58c58a: Pull complete
02513d648eec: Pull complete
2a31f6c80f77: Pull complete
9022d53d3571: Pull complete
3fc2a72e96e7: Pull complete
Digest: sha256:70e5f2454148f16385ffbc1b1fb71f3a171a8ef8665c8b482235656678b7df93
Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:7.13.4
docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Ejecución del contenedor de Elasticsearch

Lanzaremos la ejecución del contenedor, para ello ejecutaremos el siguiente comando.

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.4

El comando configurara la ejecución, activando el enrutado de los puertos 9200 y 9300 desde nuestra máquina, al contenedor. Además, establece el servidor de elasticsearch en modo autónomo.

En la pantalla nos aparece la salida del log de elasticsearch.

Si queremos pararla, solo tendremos que pulsar la combinación de teclas Ctrl-C. Puede que a la primera no responda, pulsaremos varias veces hasta que se pare. También, lo podremos parar, abriendo otra terminal, y ejecutando el siguiente comando

$ sudo docker stop <nombre_imagen>

Para saber como se llama nuestro contenedor podemos lanzar el siguiente comando para ver las imágenes que tenemos en ejecución

$ docker ps

Una vez que lo hemos parado, no tenemos que volver a ejecutar el comando «docker run», simplemente con iniciar nuestro contenedor, sera  suficiente. Esto lo podemos hacer con el siguiente comando.

$ sudo docker start <nombre_imagen>

Podemos personalizar el nombre de nuestra imagen agregando el siguiente argumento al comando «docker run»

--name <nombre_imagen>

El comando «docker run» nos quedaría de la siguiente forma.

$ sudo docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Prueba de funcionamiento de Elasticsearch

Para probar que nuestro servidor de elasticsearch está funcionado, y responde correctamente, podemos lanzar el siguiente comando.

$ curl -X GET "localhost:9200/?pretty"

Y si todo es correcto, y nuestro contenedor está funcionado correctamente, obtendremos una respuesta parecida a la siguiente.

{
"name" : "1c1a4c8db052",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "lg2UQNHASCGozGjkaAV12g",
"version" : {
"number" : "7.13.4",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "c5f60e894ca0c61cdbae4f5a686d9f08bcefc942",
"build_date" : "2021-07-14T18:33:36.673943207Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

Problemas de consumo de memória de Elastic

El consumo de la memoria de Elaticsearch puede ser muy grande, dejando a la máquina host casi sin recursos. Para evitar este escenario, podemos establece un limite de uso de memoria para el elastic dentro del contenedor.

Para establecer este límite, tendremos que establecer unas variables de entrono dentro de nuestro contenedor. Esto se realiza añadiendo el siguiente argumento al comando «docker run».

-e «ES_JAVA_OPTS=-Xms<Xg> -Xmx<Xg>»

Quedando nuestro comando de la siguiente forma para una configuración de uso de 3g de memoria para nuestro elasticsearch.

sudo docker run -p 9200:9200 -p 9300:9300 -e «discovery.type=single-node» -e «ES_JAVA_OPTS=-Xms3g -Xmx3g» –name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Tambien podemos establecer este valor en megas, para ello solo tendremos que cambia la «g» del final por una m. Por ejemplo para establecer los mismos 3 gigas anteriores en megas, el comando quedaría de la siguiente forma:

sudo docker run -p 9200:9200 -p 9300:9300 -e «discovery.type=single-node» -e «ES_JAVA_OPTS=-Xms3072m -Xmx3072m» –name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

El valor recomendable para estos paŕámetros, son el 50% de la memoria de la que disponga la máquina host.