Instalar Elasticsearch en Docker

De ChuWiki


Partimos de que tenemos docker instalado y funcionando.

Instalar la imagen de Elasticsearch[editar]

El comando docker para descargar y arrancar por primera vez una imagen de Elasticsearch es

 docker run -d --name elastic2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.12.0

Veamos las opciones

  • -d es una opción propia de docker. Ejecuta la imagen liberando la terminal en la que lo arranquemos (modo detached). Si no ponemos esta opción, nuestra terminal empezará a mostrar el log de Elasticsearch y no podremos seguir usando esa terminal.
  • --name elastic2 es el nombre que queramos dar a nuestro contenedor.
  • -p 9200:9200 es para publicar el puerto 9200 en nuestro host anfitrión de docker. Este puerto es con el que los clientes de Elasticsearch se conectan a Elasticsearch. Es un puerto HTTPS.
  • -p 9300:9300 es para publicar el puerto 9300 en nuestro host anfitrión de docker. Este puerto es el que usa un nodo Elasticsearch para comunicarse con otros nodos Elasticsearch.
  • -e "discovery.type=single-node" para indicar que sólo queremos ejecutar un nodo, que no vamos a montar un cluster con varios nodos Elasticsearch
  • docker.elastic.co/elasticsearch/elasticsearch:8.12.0 Ubicación y versión de la imagen de Elasticsearch que queremos arrancar. Si usas imágenes en docker hub no necesitas poner delante todo el path, bastaría con elasticsearch:8.11.4, pero sólo tienes las versiones que existan en docker hub.

Con esto debería descargarse y arrancarse el contenedor de Elasticsearch

Usuario y Password por defecto en Elasticsearch[editar]

El usuario por defecto es elastic. Si hemos ejecutado sin la opción -d y tenemos en pantalla el log de Elasticsearch, podemos buscar ahí la password, puesto que en el primer arranque se muestra en el log.

Si lo hemos hecho con la opción -d, no tendremos visible la password. Podríamos entran en el contenedor y buscar los ficheros de log, pero es más sencillo ponerle una password nueva al usuario elastic. Para ello, podemos ejecutar el comando

docker exec -it elastic2 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

La salida de este comando será algo parecido a esto

WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y

Password for the [elastic] user successfully reset.
New value: hQ_ihRP0IEMDtpDmAhrw

Nos advierte que se va a mostrar la password en pantalla y nos pregunta si queremos continuar y contestando y nos da una nueva password para el usuario elastic. Si accedemos ahora con el navegador web a https://127.0.0.1:9200/

  • Nos dará un error de certificado, lo vemos más adelante. De momento acepta la navegación aunque el certificado no sea seguro
  • Nos pide un usuario y password. El usuario es elastic y el password el que se ha generado con el comando anterior. En el ejemplo, hQ_ihRP0IEMDtpDmAhrw.

Deberíamos ver una página con un contenido JSON similar al siguiente

{
  "name" : "7ccf62443eb7",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "J_-phbuMSBGNwURXSoGG5g",
  "version" : {
    "number" : "8.12.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1665f706fd9354802c02146c1e6b5c0fbcddfbc9",
    "build_date" : "2024-01-11T10:05:27.953830042Z",
    "build_snapshot" : false,
    "lucene_version" : "9.9.1",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Certificado de Elasticsearch[editar]

Hemos visto que obtenemos un error de certificado en el navegador. Elasticsearch genera varios certificados. Uno de ellos es un certificado "CA" (Autoridad de Confianza) con el que firma el certificado que se presentará a través de HTTPS y que es el certificado que ve el navegador.

Para que el navegador (o el cliente que usemos) acepte el certificado HTTPS que presenta Elasticsearch, debemos coger el certificado "CA" e instalarlo en nuestro cliente como certificado de autoridad de confianza.

El siguiente comando nos permite obtener una copia de este certificado "CA", que está dentro del contendor de Elasticsearch

docker cp elastic2:/usr/share/elasticsearch/config/certs/http_ca.crt .

Hemos usado el comando docker cp que nos permite copiar ficheros que estén en un contenedor docker. elastic2 es el nombre de nuestro contenedor, luego :, el path dentro del contenedor del fichero que queremos copiar y luego . para indicar que lo copiamos en nuestro directorio actual.

Ahora debemos abrir el navegador e instalar el certificado de confianza. Solo un detalle, si estás en un sistema linux y ejecutas los comandos docker con sudo, el fichero del certificado http_ca.crt será del usuario y grupo root. Acuérdate de ponerle un usuario y grupo con el que el navegador pueda acceder a dicho fichero, o darle permisos de lectura para others.

Una vez hecho, ya podemos visitar la URL de Elasticsearch sin obtener el error de certificado.

Quitar HTTPS en Elasticsearch[editar]

Si no queremos liarnos con el certificado porque estamos en un contenedor de pruebas, podemos quitar HTTPS y dejar que elastic trabaje con HTTP, sin certificado.

Dentro del contenedor, el fichero de configuración donde se cambia este punto está en usr/share/elasticsearch/config/elasticsearch.yml. El contenido de ese fichero es similar a este

cluster.name: "docker-cluster"
network.host: 0.0.0.0

#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically      
# generated to configure Elasticsearch security features on 20-01-2024 09:04:58
#
# --------------------------------------------------------------------------------

# Enable security features
xpack.security.enabled: true

xpack.security.enrollment.enabled: true

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------

nos bastaría cambiar, en la línea 18, true por false. Desgraciadamente, en Elasticsearch en docker no hay ningún editor de texto instalado, por lo que lo más sencillo es copiarnos el fichero fuera del contenedor, editarlo en nuestro ordenador y volver a copiarlo en el contenedor

# Copiar el fichero del contenedor a nuestro ordenador.
docker cp elastic2:/usr/share/elasticsearch/config/elasticsearch.yml .

# Editar y salvar el fichero.
gvim elasticsearch.yml

# Volver a subir el fichero al contenedor
docker cp elasticsearch.yml elastic2:/usr/share/elasticsearch/config/elasticsearch.yml

# Parar y rearrancar el contenedor
docker stop elastic2
docker start elastic2

Listo, podemos acceder con el navegador en http://127.0.0.1:9200

Crear usuarios y password en Elasticsearch[editar]

Hasta ahora estamos usando el usuario por defecto elastic con la password que nos ha generado en la instalación. Normalmente se deben crear usuarios a medida, seguramente con menos permisos que el que tiene este usuario por defecto.

Para ello, podemos ejecutar el siguiente comando

docker exec elastic2 elasticsearch-users useradd javier -p javier -r superuser

Estamos ejecutando dentro del contenedor el comando elasticsearch-users que sirve para gestionar los usuarios. Las opciones

  • useradd para añadir un nuevo usuario
  • javier es el nombre del usuario
  • -p javier para poner la password. Siguiendo todas las buenas costumbres de seguridad, una password segura que coincide con el nombre del usuario :P
  • -r superuser roles que queramos que tenga ese usuario. superuser es un rol predefinido en Elasticsearch y seguramente es excesivo para un usuario normal. Nos vale sin embargo para desarrollo y pruebas. Para un entorno más serio, tendríamos que usar otros roles predefinidos más restrictivos que este o crear nuestros propios roles.