Introducción
En este tutorial, aprenderá a instalar ELK Stack con Docker Compose en un servidor con Ubuntu (versión 22.04). ELK Stack está compuesto por Elasticsearch, Kibana y Logstash.
- Elasticsearch es un motor de búsqueda y análisis.
- Kibana es una interfaz de usuario para el análisis de datos.
- Logstash puede analizar registros relacionados con la aplicación.
Requisitos previos
- Un servidor que ejecuta Ubuntu 22.04 o posterior: acceso SSH a ese servidor y acceso de usuario root o sudo
- Conocimientos básicos de Docker, Docker Compose, ElasticSearch y YAML
Paso 1: Instalar Docker Compose
Si ya tiene Docker Compose instalado en su servidor, puede omitir este paso. Primero, acceda a su servidor por SSH con el siguiente comando:
ssh holu@<your_host>
Asegúrese de actualizar los paquetes apt e instalar cURL:
sudo apt-get update && sudo apt-get install curl -y
Después de asegurarnos de que curl esté instalado, podemos usar el script de instalación rápida proporcionado por Docker para instalar Docker y Docker Compose:
curl https://get.docker.com | sh
Este comando descarga el script de get.docker.com y lo envía a sh (lo envía a sh, que lo ejecuta e instala Docker). Lo último que podemos hacer es agregarnos al grupo Docker para no tener que usar sudo cada vez que usemos el comando docker.
sudo usermod -aG docker holu
Asegúrese de cerrar sesión y volver a iniciarla para aplicar los cambios.
Paso 2: Crear docker-compose.yaml
Archivo docker-compose.yaml Se utilizará para declarar toda la infraestructura de la pila ELK. Permite crear múltiples contenedores con un solo comando.
Crea una nueva carpeta en tu servidor y crea un archivo docker-compose.yaml Crea en él:
mkdir elk-stack && cd elk-stack && touch docker-compose.yaml
Queremos usar Docker Compose para crear tres contenedores Docker:
Para crear estos tres contenedores, agregue el siguiente contenido al archivo docker-compose.yaml Agregar:
version: "3"
services:
setup:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.1
environment:
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- KIBANA_PASSWORD=${KIBANA_PASSWORD}
container_name: setup
command:
- bash
- -c
- |
echo "Waiting for Elasticsearch availability";
until curl -s http://elasticsearch:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
echo "Setting kibana_system password";
until curl -s -X POST -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" http://elasticsearch:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
echo "All done!";
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.1
# give the container a name
# this will also set the container's hostname as elasticsearch
container_name: elasticsearch
environment:
- discovery.type=single-node
- cluster.name=elasticsearch
- bootstrap.memory_lock=true
# limits elasticsearch to 1 GB of RAM
- ES_JAVA_OPTS=-Xms1g -Xmx1g
# The password for the 'elastic' user
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- xpack.security.http.ssl.enabled=false
kibana:
image: docker.elastic.co/kibana/kibana:8.12.1
container_name: kibana
ports:
- 5601:5601
environment:
# remember the container_name for elasticsearch?
# we use it here to access that container
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- ELASTICSEARCH_USERNAME=kibana_system
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
# Change this to true if you want to sent
# telemetry data to kibana developers
- TELEMETRY_ENABLED=falseActualmente nos falta un elemento: el archivo .env. Este archivo se utiliza para almacenar secretos como contraseñas y tokens de API para eliminarlos de la configuración o el código. Docker Compose detecta automáticamente el archivo .env y reemplaza variables como ${MY_VARIABLE} con la variable env.
Crea env y agrega las siguientes líneas:
ELASTIC_PASSWORD=<your-elastic-password>
KIBANA_PASSWORD=<your-kibana-password>Ahora puedes ejecutar Docker Compose para poner todo en funcionamiento:
docker compose up -d
Producción:
[+] Running 3/4
⠇ Network elk-stack_default Created
:heavy_check_mark: Container kibana Started
:heavy_check_mark: Container setup Started
:heavy_check_mark: Container elasticsearch StartedPuedes utilizar el comando Docker PS Úselo para comprobar si todo funciona como se espera.
holu@<your_host>:~/elk-stack$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<id> docker.elastic.co/kibana/kibana:8.12.1 "<command>" About a minute ago Up About a minute 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
<id> docker.elastic.co/elasticsearch/elasticsearch:8.12.1 "<command>" About a minute ago Up About a minute 9200/tcp, 9300/tcp elasticsearch
Ahora puedes iniciar Kibana en un navegador web ingresando :5601 Abrir en la barra de URL.
Con nombre de usuario elástico y la contraseña previamente guardada en el archivo .env Has decidido iniciar sesión.
Si ve esta página al iniciar sesión, haga clic en “Explorar por mi cuenta”.
Ahora deberías poder acceder a la página de inicio de Kibana. Se ve así:

Paso 3 – Logstash
Ahora es el momento de añadir la última pieza del rompecabezas: Logstash. Logstash puede analizar los registros de tus aplicaciones y enviarlos a Elasticsearch.
docker-compose.yaml Edite y agregue el cuarto contenedor en la sección “Servicios” bajo “kibana”.
logstash:
image: docker.elastic.co/logstash/logstash:8.12.1
container_name: logstash
command:
- /bin/bash
- -c
- |
cp /usr/share/logstash/pipeline/logstash.yml /usr/share/logstash/config/logstash.yml
echo "Waiting for Elasticsearch availability";
until curl -s http://elasticsearch:9200 | grep -q "missing authentication credentials"; do sleep 1; done;
echo "Starting logstash";
/usr/share/logstash/bin/logstash -f /usr/share/logstash/pipeline/logstash.conf
environment:
- xpack.monitoring.enabled=false
- ELASTIC_USER=elastic
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- ELASTIC_HOSTS=http://elasticsearch:9200
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.confConfigurar Logstash es un poco más complicado. Necesita un archivo de configuración adicional llamado logstash.conf. Logstash funciona con un pipeline. Este archivo describe las funciones de Logstash (de dónde provienen los registros, cómo analizarlos y adónde enviarlos). El pipeline se encuentra en el archivo logstash.conf.
Esta es una de las líneas más básicas de cosas que puedes tener:
input {
file {
path => "/var/log/dpkg.log"
start_position => "beginning"
}
}
filter { }
output {
elasticsearch {
hosts => "${ELASTIC_HOSTS}"
user => "elastic"
password => "${ELASTIC_PASSWORD}"
index => "logstash-%{+YYYY.MM.dd}"
}
stdout { }
}Se explica por sí solo. Toma un archivo como entrada (en este caso, /var/log/dpkg.log) y envía la salida a Elasticsearch y la salida estándar.
Coloque el ejemplo anterior en su archivo logstash.conf.
El directorio elk-stack ahora debería contener los siguientes archivos:
elk-stack/
├── .env
├── docker-compose.yaml
└── logstash.confAhora puedes iniciar Logstash usando el siguiente comando:
docker compose up -d
Producción:
[+] Running 4/4
:heavy_check_mark: Container logstash Started
:heavy_check_mark: Container setup Started
:heavy_check_mark: Container elasticsearch Running
:heavy_check_mark: Container kibana RunningAhora puedes acceder a Logstash desde Kibana. Primero, debes crear una vista de datos de Logstash.
Ve a la página de descubrimiento de Analytics. Deberías ver algo como esto:
Cree su vista de datos haciendo clic en el botón “Crear vista de datos”:
Después de guardar la vista de datos, debería poder ver los informes provenientes de Logstash:

Paso 4 – Destruir la pila
Por último, para detener la pila y eliminar los contenedores, ejecute el siguiente comando:
docker compose down
Producción:
[+] Running 5/5
:heavy_check_mark: Container logstash Removed
:heavy_check_mark: Container elasticsearch Removed
:heavy_check_mark: Container kibana Removed
:heavy_check_mark: Container setup Removed
:heavy_check_mark: Network elk-stack_default RemovedResultado
Debería tener una pila ELK ejecutándose con Docker Compose. Los siguientes pasos son agregar generadores de informes como Filebeat o consultar la documentación oficial.
















