Curso ELK: Montar ELK Stack en Portainer y Docker Compose
Para poder proseguir con el curso de ELK Stack (ElasticSearch + LogStash + Kibana), voy a explicaros como podemos configurarlo fácilmente mediante Docker Compose. Para ello, usaré mi nuevo NAS Asustor y el Portainer que corre bajo él.
Requisitos para montar ELK Stack bajo Docker
Para mi laboratorio estoy usando:
- NAS Asustor con:
- Docker y Portainer instalados (desde App Central)
- Al menos 4 GB de RAM (más de 8 GB recomendado)
- CPU x86_64 (no ARM)
- Acceso SSH y permisos administrativos (recomendado para debugging)
- Docker Compose habilitado en Portainer (v2.9+)
Estructura de carpetas
Como dispongo de varios volúmenes, mi estructura será la siguiente para tener datos persistentes:
1 |
/volume2/Docker/elk/ |
Con subdirectorios para los diferentes componentes, por ejemplo:
1 |
/volume2/Docker/elk/elasticsearch/data |
Ejemplo fichero docker-compose.yml para ELK en Portainer
Os dejo mi fichero YAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
version: '3.8' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2 container_name: elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - bootstrap.memory_lock=true - ES_JAVA_OPTS=-Xms1g -Xmx1g ulimits: memlock: soft: -1 hard: -1 volumes: - /volume2/Docker/elk/elasticsearch/data:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - elk kibana: image: docker.elastic.co/kibana/kibana:8.12.2 container_name: kibana environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" depends_on: - elasticsearch networks: - elk logstash: image: docker.elastic.co/logstash/logstash:8.12.2 container_name: logstash volumes: - /volume2/Docker/elk/logstash/pipeline:/usr/share/logstash/pipeline ports: - "5044:5044" # Beats - "5000:5000" # TCP Input - "9600:9600" # Monitoring API depends_on: - elasticsearch networks: - elk filebeat: image: docker.elastic.co/beats/filebeat:8.12.2 container_name: filebeat user: root volumes: - /volume2/Docker/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro depends_on: - logstash networks: - elk networks: elk: driver: bridge |
Añadir pipeline básico para LogStash
Creamos un fichero “logstash.conf” y carpetas en la estructura “/volume2/Docker/elk/logstash/pipeline” con el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
input { tcp { port => 5000 codec => json } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] } stdout { codec => rubydebug } } |
Fichero configuración Filebeat
Como usaré Filebeat, genero el fichero “filebeat.yml” y la carpeta:
1 2 3 4 5 6 7 8 9 10 11 12 |
filebeat.inputs: - type: container paths: - /var/lib/docker/containers/*/*.log processors: - add_docker_metadata: ~ output.logstash: hosts: ["logstash:5000"] setup.kibana: host: "kibana:5601" |
Lanzar ELK desde Portainer
Con todo preparado lanzamos desde Portainer de la siguiente forma:
- Accede a Portainer (http://IP-NAS:9000)
- Ve a Stacks > Add Stack
- Nombre: elk
- Pega el contenido del docker-compose.yml
- Haz clic en Deploy the stack
Podremos acceder mediante la URL “http://IP-NAS:5601”:
- Para entornos con poca RAM, elimina Logstash y envía logs directamente desde Filebeat u otras herramientas a Elasticsearch.
- Si ves errores de memoria, reduce ES_JAVA_OPTS a -Xms512m -Xmx512m
- Para logs locales (de servicios como Docker), puedes añadir Filebeat como contenedor adicional.
Entradas Curso ELK
- Curso ELK: Fundamentos del Stack ELK
- Curso ELK: Montar ELK Stack en Portainer y Docker Compose
- Curso ELK: Cómo en Enviar Logs de Windows 11
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?