Run the latest version of the Elastic stack with Docker and Docker Compose.
It gives you the ability to analyze any data set by using the searching/aggregation capabilities of Elasticsearch and the visualization power of Kibana.
Based on the official Docker images from Elastic:
Other available stack variants:
-
light
: This is the simplest and lightest option -
original
: Original repo -
tls
: TLS encryption enabled in Elasticsearch -
searchguard
: Search Guard support
We aim at providing the simplest possible entry into the Elastic stack for anybody who feels like experimenting with this powerful combo of technologies. This project's default configuration is purposely minimal and unopinionated. It does not rely on any external dependency, and uses as little custom automation as necessary to get things up and running.
Instead, we believe in good documentation so that you can use this repository as a template, tweak it, and make it your own.
- Docker Engine version 18.06.0 or newer
- Docker Compose version 1.26.0 or newer (including Compose V2)
- 1.5 GB of RAM
ℹ️ Especially on Linux, make sure your user has the required permissions to interact with the Docker daemon.
By default, the stack exposes the following ports:
- 514: Logstash SYSLOG UDP input
- 9600: Logstash monitoring API
- 9200: Elasticsearch HTTP
- 9300: Elasticsearch TCP transport
- 5601: Kibana
If you are using the legacy Hyper-V mode of Docker Desktop for Windows, ensure File Sharing is
enabled for the C:
drive.
The default configuration of Docker Desktop for Mac allows mounting files from /Users/
, /Volume/
, /private/
,
/tmp
and /var/folders
exclusively. Make sure the repository is cloned in one of those locations or follow the
instructions from the documentation to add more locations.
docker-compose build
whenever you switch branch or update the
version of an already existing stack.
Clone this repository onto the Docker host that will run the stack, then start the stack's services locally using Docker Compose:
$ docker-compose up
ℹ️ You can also run all services in the background (detached mode) by appending the -d
flag to the
above command.
Give Kibana about a minute ( or four on slower machines ) to initialize, then access the Kibana web UI by opening http://localhost:5601 in a web browser.
Open the Kibana web UI by opening http://localhost:5601 in a web browser
Now that the stack is fully configured, you can go ahead and inject some log entries. The shipped Logstash configuration allows you to send content via UDP:
# Using BSD netcat (Debian, Ubuntu, MacOS system, ...)
$ nc -w1 -u localhost 514 <<< "testing messages from local machine"
You can also load the sample data provided by your Kibana installation.
Port 514 UDP is also exposed on your laptop's LAN ip ( 192.168.1.122 in my case, check you local IP ) and you can receive logs from another machine in your LAN.
Elasticsearch data is persisted inside a volume by default.
In order to entirely shutdown the stack and remove all persisted data, use the following Docker Compose command:
$ docker-compose down -v
ℹ️ Configuration is not dynamically reloaded, you will need to restart individual components after any configuration change.
The Elasticsearch configuration is stored in elasticsearch/config/elasticsearch.yml
.
You can also specify the options you want to override by setting environment variables inside the Compose file:
elasticsearch:
environment:
network.host: _non_loopback_
cluster.name: my-cluster
Please refer to the following documentation page for more details about how to configure Elasticsearch inside Docker containers: Install Elasticsearch with Docker.
The Kibana default configuration is stored in kibana/config/kibana.yml
.
You can also specify the options you want to override by setting environment variables inside the Compose file:
kibana:
environment:
SERVER_NAME: kibana.example.org
Please refer to the following documentation page for more details about how to configure Kibana inside Docker containers: Install Kibana with Docker.
The Logstash configuration is stored in logstash/config/logstash.yml
.
You can also specify the options you want to override by setting environment variables inside the Compose file:
logstash:
environment:
LOG_LEVEL: debug
Please refer to the following documentation page for more details about how to configure Logstash inside Docker containers: Configuring Logstash for Docker.
Disabled by default in this version, is meant to be as light and easy as possible to use.
Follow the instructions from the Wiki: Scaling out Elasticsearch
No security, no passwords, no problem. Just remember, localhost only.
To add plugins to any ELK component you have to:
- Add a
RUN
statement to the correspondingDockerfile
(eg.RUN logstash-plugin install logstash-filter-json
) - Add the associated plugin code configuration to the service configuration (eg. Logstash input/output)
- Rebuild the images using the
docker-compose build
command
A few extensions are available inside the extensions
directory. These extensions provide features which
are not part of the standard Elastic stack, but can be used to enrich it with extra integrations.
The documentation for these extensions is provided inside each individual subdirectory, on a per-extension basis. Some of them require manual changes to the default ELK configuration.
By default, both Elasticsearch and Logstash start with 1/4 of the total host memory allocated to the JVM Heap Size.
The startup scripts for Elasticsearch and Logstash can append extra JVM options from the value of an environment variable, allowing the user to adjust the amount of memory that can be used by each component:
Service | Environment variable |
---|---|
Elasticsearch | ES_JAVA_OPTS |
Logstash | LS_JAVA_OPTS |
To accomodate environments where memory is scarce (Docker for Mac has only 2 GB available by default), the Heap Size
allocation is capped by default to 256MB per service in the docker-compose.yml
file. If you want to override the
default JVM configuration, edit the matching environment variable(s) in the docker-compose.yml
file.
For example, to increase the maximum JVM Heap Size for Logstash:
logstash:
environment:
LS_JAVA_OPTS: -Xmx1g -Xms1g
As for the Java Heap memory (see above), you can specify JVM options to enable JMX and map the JMX port on the Docker host.
Update the {ES,LS}_JAVA_OPTS
environment variable with the following content (I've mapped the JMX service on the port
18080, you can change that). Do not forget to update the -Djava.rmi.server.hostname
option with the IP address of your
Docker host (replace DOCKER_HOST_IP):
logstash:
environment:
LS_JAVA_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=18080 -Dcom.sun.management.jmxremote.rmi.port=18080 -Djava.rmi.server.hostname=DOCKER_HOST_IP -Dcom.sun.management.jmxremote.local.only=false
See the following Wiki pages: