docker-elk README

The project's README from github.com/deviantony/docker-elk. As one markdown file: README.md.

Elastic stack (ELK) on Docker

Elastic Stack version Build Status

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:

[!IMPORTANT] Platinum features are enabled by default for a trial duration of 30 days. After this evaluation period, you will retain access to all the free features included in the Open Basic license seamlessly, without manual intervention required, and without losing any data. Refer to the How to disable paid features section to opt out of this behaviour.


tl;dr

docker compose up setup
docker compose up
Animated demo

Philosophy

The main goal of docker-elk is to make the Elastic stack as easy as possible to get into. It is not a blueprint for a production-ready deployment, but rather a template that promotes tweaking and exploration.

The authors believe in good documentation over elaborate automation. The project's default configuration is purposely minimal and unopinionated. The initial setup does not rely on any external dependency, and uses as little scripting as necessary to get things up and running.


Contents

  1. Requirements
  2. Usage
  3. Configuration
  4. Extensibility
  5. JVM tuning
  6. Going further

Requirements

Host setup

[!NOTE] 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:

[!WARNING] Elasticsearch's bootstrap checks were purposely disabled to facilitate the setup of the Elastic stack in development environments. For production setups, we recommend users to set up their host according to the instructions from the Elasticsearch documentation: Important System Configuration.

Docker Desktop

Windows

If you are using the legacy Hyper-V mode of Docker Desktop for Windows, ensure that File Sharing is enabled for the C: drive.

macOS

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.

Usage

[!WARNING] You must rebuild the stack images with docker compose build whenever you switch branch or update the version of an already existing stack.

Bringing up the stack

Clone this repository onto the Docker host that will run the stack with the command below:

git clone https://github.com/deviantony/docker-elk.git

Then, initialize the Elasticsearch users and groups required by docker-elk by executing the command:

docker compose up setup

Optionally (but highly recommended), generate encryption keys for Kibana using the following command and copy its output to the Kibana configuration file (kibana/config/kibana.yml):

docker compose up kibana-genkeys

If everything went well and the setup completed without error, start the other stack components:

docker compose up

[!NOTE] 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 to initialize, then access the Kibana web UI by opening http://localhost:5601 in a web browser and use the following (default) credentials to log in:

[!NOTE] Upon the initial startup, the elastic, logstash_internal and kibana_system Elasticsearch users are initialized with the values of the passwords defined in the .env file ("changeme" by default). The first one is the built-in superuser, the other two are used by Kibana and Logstash respectively to communicate with Elasticsearch. This task is only performed during the initial startup of the stack. To change users' passwords after they have been initialized, please refer to the instructions in the next section.

Initial setup

Setting up user authentication

[!NOTE] Refer to Security settings in Elasticsearch to disable authentication.

[!WARNING] Starting with Elastic v8.0.0, it is no longer possible to run Kibana using the bootstrapped privileged elastic user.

The "changeme" password set by default for all aforementioned users is unsecure. For increased security, we will reset the passwords of all aforementioned Elasticsearch users to random secrets.

  1. Reset passwords for default users

    The commands below reset the passwords of the elastic, logstash_internal and kibana_system users. Take note of them.

    docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user elastic
    
    docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user logstash_internal
    
    docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user kibana_system
    

    If the need for it arises (e.g. if you want to collect monitoring information through Beats and other components), feel free to repeat this operation at any time for the rest of the built-in users.

  2. Replace usernames and passwords in configuration files

    Replace the password of the elastic user inside the .env file with the password generated in the previous step. Its value isn't used by any core component, but extensions use it to connect to Elasticsearch.

    [!NOTE] In case you don't plan on using any of the provided extensions, or prefer to create your own roles and users to authenticate these services, it is safe to remove the ELASTIC_PASSWORD entry from the .env file altogether after the stack has been initialized.

    Replace the password of the logstash_internal user inside the .env file with the password generated in the previous step. Its value is referenced inside the Logstash pipeline file (logstash/pipeline/logstash.conf).

    Replace the password of the kibana_system user inside the .env file with the password generated in the previous step. Its value is referenced inside the Kibana configuration file (kibana/config/kibana.yml).

    See the Configuration section below for more information about these configuration files.

  3. Restart Logstash and Kibana to re-connect to Elasticsearch using the new passwords

    docker compose up -d logstash kibana
    

[!NOTE] Learn more about the security of the Elastic stack at Secure the Elastic Stack.

Injecting data

Launch the Kibana web UI by opening http://localhost:5601 in a web browser, and use the following credentials to log in:

Now that the stack is fully configured, you can go ahead and inject some log entries.

The shipped Logstash configuration allows you to send data over the TCP port 50000. For example, you can use one of the following commands — depending on your installed version of nc (Netcat) — to ingest the content of the log file /path/to/logfile.log in Elasticsearch, via Logstash:

# Execute `nc -h` to determine your `nc` version

cat /path/to/logfile.log | nc -q0 localhost 50000          # BSD
cat /path/to/logfile.log | nc -c localhost 50000           # GNU
cat /path/to/logfile.log | nc --send-only localhost 50000  # nmap

You can also load the sample data provided by your Kibana installation.

Cleanup

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 --profile=setup down -v

Version selection

This repository stays aligned with the latest version of the Elastic stack. The main branch tracks the current major version (9.x).

To use a different version of the core Elastic components, simply change the version number inside the .env file. If you are upgrading an existing stack, remember to rebuild all container images using the docker compose build command.

[!IMPORTANT] Always pay attention to the official upgrade instructions for each individual component before performing a stack upgrade.

Older major versions are also supported on separate branches:

Configuration

[!IMPORTANT] Configuration is not dynamically reloaded, you will need to restart individual components after any configuration change.

How to configure Elasticsearch

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.

How to configure Kibana

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.

How to configure Logstash

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.

How to disable paid features

You can cancel an ongoing trial before its expiry date — and thus revert to a basic license — either from the License Management panel of Kibana, or using Elasticsearch's start_basic Licensing API. Please note that the second option is the only way to recover access to Kibana if the license isn't either switched to basic or upgraded before the trial's expiry date.

Changing the license type by switching the value of Elasticsearch's xpack.license.self_generated.type setting from trial to basic (see License settings) will only work if done prior to the initial setup. After a trial has been started, the loss of features from trial to basic must be acknowledged using one of the two methods described in the first paragraph.

How to scale out the Elasticsearch cluster

Follow the instructions from the Wiki: Scaling out Elasticsearch

How to re-execute the setup

To run the setup container again and re-initialize all users for which a password was defined inside the .env file, simply "up" the setup Compose service again:

$ docker compose up setup
 ⠿ Container docker-elk-elasticsearch-1  Running
 ⠿ Container docker-elk-setup-1          Created
Attaching to docker-elk-setup-1
...
docker-elk-setup-1  | [+] User 'monitoring_internal'
docker-elk-setup-1  |    ⠿ User does not exist, creating
docker-elk-setup-1  | [+] User 'beats_system'
docker-elk-setup-1  |    ⠿ User exists, setting password
docker-elk-setup-1 exited with code 0

How to reset a password programmatically

If for any reason your are unable to use Kibana to change the password of your users (including built-in users), you can use the Elasticsearch API instead and achieve the same result.

In the example below, we reset the password of the elastic user (notice "/user/elastic" in the URL):

curl -XPOST -D- 'http://localhost:9200/_security/user/elastic/_password' \
    -H 'Content-Type: application/json' \
    -u elastic:<your current elastic password> \
    -d '{"password" : "<your new password>"}'

Extensibility

How to add plugins

To add plugins to any ELK component you have to:

  1. Add a RUN statement to the corresponding Dockerfile (eg. RUN logstash-plugin install logstash-filter-json)
  2. Add the associated plugin code configuration to the service configuration (eg. Logstash input/output)
  3. Rebuild the images using the docker compose build command

How to enable the provided extensions

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.

JVM tuning

How to specify the amount of memory used by a service

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 accommodate environments where memory is scarce (Docker Desktop for Mac has only 2 GB available by default), the Heap Size allocation is capped by default in the docker-compose.yml file to 512 MB for Elasticsearch and 256 MB for Logstash. 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: -Xms1g -Xmx1g

When these options are not set:

How to enable a remote JMX connection to a service

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

Going further

Plugins and integrations

See the following Wiki pages:

docker-elk (deviantony/docker-elk)

Searching Database…

这是什么东西?docker-elk 是一套 Docker Compose 配置,用 Elastic 官方镜像把整套 Elastic 组件——Elasticsearch、Logstash 和 Kibana——一键跑起来,让你几乎不用做任何配置就能搜索、汇总和可视化数据。
这是需要安装的应用,还是更像一个模板?它不是一个独立的应用,而是一组 Compose 文件和相关配置,围绕 Elastic 官方的 Elasticsearch、Logstash 和 Kibana Docker 镜像搭建。你把仓库克隆下来,Compose 就会自动帮你构建并运行整套组件。
怎么把它跑起来?把仓库克隆到 Docker 主机上,先运行一次 setup 这个 Compose 服务来初始化 Elasticsearch 的用户,然后用 'docker compose up -d' 把所有服务启动。Kibana 大约需要等一分钟,之后在浏览器的 5601 端口打开它的网页界面即可。
我需要提前装好哪些东西?只需要 Docker Engine 18.06.0 或更新版本、Docker Compose 2.0.0 或更新版本,以及 1.5 GB 内存。Windows 和 macOS 上用 Docker Desktop 就行;Linux 上你的用户需要有权限和 Docker 守护进程交互。
原样直接用在生产环境可以吗?不太合适。作者把它定位成用来 tweak 和探索的模板,而不是生产级的方案——Elasticsearch 的启动检查被关闭了,而且修改配置后需要重启相关的组件才能生效。
这些要花钱吗?这个仓库采用 MIT 许可证,完全免费。整套组件默认会开启付费的 Platinum 功能并提供 30 天试用,试用期结束后会自动回退到免费的 Open Basic 许可证,数据不会丢失——你也可以提前手动切换到 basic。
怎么把日志导入 Elasticsearch?自带的 Logstash 管道通过 TCP 端口 50000 接收数据——比如可以用 nc 把一个日志文件直接管道传给它——Kibana 里也提供可以一键加载的示例数据。Elasticsearch 本身在 9200 端口可以访问。
默认密码是怎么回事?首次启动时,elastic、logstashinternal 和 kibanasystem 这几个用户会使用 .env 文件里设置的密码初始化(默认是 'changeme')。README 里详细介绍了如何把它们重置成随机密码、更新配置文件,然后重启 Logstash 和 Kibana。
我能运行旧版本的 Elastic 组件吗?可以。main 分支对应当前的大版本(9.x);想固定用其他版本,只要修改 .env 文件里的版本号并重新构建镜像即可。release-8.x 到 release-5.x 这些分支覆盖了旧的大版本,不过 5.x–7.x 已经停止维护了。
怎么给各个组件添加插件?在对应组件的 Dockerfile 里加一条 RUN 语句(比如 RUN logstash-plugin install logstash-filter-json),加上插件的配置,然后用 docker compose build 重新构建镜像。extensions 目录里还附带了一些额外的集成。
Creator
deviantony
Size
1 MB
Stars
18.4K
Age
11y
Commits · 90 Days