Введение
В этом руководстве вы узнаете, как установить ELK STack с помощью Docker Compose на сервер под управлением Ubuntu (версия 22.04). ELK Stack включает в себя Elasticsearch, Kibana и Logstash.
- Elasticsearch — поисковая и аналитическая система.
- Kibana — это пользовательский интерфейс для анализа данных.
- Logstash может анализировать журналы, связанные с приложениями.
Предпосылки
- Сервер под управлением Ubuntu 22.04 или более поздней версии: доступ по SSH к этому серверу и доступ с правами root или sudo.
- Базовые знания Docker, Docker Compose, ElasticSearch и YAML
Шаг 1 — Установка Docker Compose
Если на вашем сервере уже установлен Docker Compose, вы можете пропустить этот шаг. Сначала подключитесь к серверу по SSH, используя следующую команду:
ssh holu@<your_host>
Обязательно обновите пакеты apt и установите cURL:
sudo apt-get update && sudo apt-get install curl -y
Убедившись, что curl установлен, мы можем использовать скрипт быстрой установки, предоставляемый Docker, чтобы установить Docker, а также Docker Compose:
curl https://get.docker.com | sh
Эта команда скачивает скрипт с get.docker.com и “передаёт” его в sh (передаёт скачанный скрипт sh, который его запускает и устанавливает Docker). Последнее, что мы можем сделать, — это добавить себя в группу Docker, чтобы не использовать sudo каждый раз при использовании команды docker.
sudo usermod -aG docker holu
Обязательно выйдите из системы и войдите снова, чтобы изменения вступили в силу.
Шаг 2 — Создание docker-compose.yaml
Файл docker-compose.yaml Он будет использоваться для объявления всей инфраструктуры стека ELK. Он также используется для создания нескольких контейнеров одной командой.
Создайте новую папку на вашем сервере и создайте файл docker-compose.yaml Создайте в нем:
mkdir elk-stack && cd elk-stack && touch docker-compose.yaml
Мы хотим использовать Docker Compose для создания трех контейнеров Docker:
Чтобы создать эти три контейнера, добавьте в файл следующее содержимое docker-compose.yaml Добавлять:
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=falseВ настоящее время отсутствует один элемент — файл .env. Файл .env используется для хранения секретных данных, таких как пароли и токены API, чтобы удалить их из конфигурации или кода. Docker Compose автоматически обнаруживает файл .env и заменяет переменные, например ${MY_VARIABLE}, на переменную env.
Создайте env и добавьте следующие строки:
ELASTIC_PASSWORD=<your-elastic-password>
KIBANA_PASSWORD=<your-kibana-password>Теперь вы можете запустить docker compose, чтобы все заработало:
docker compose up -d
Выход:
[+] 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 StartedВы можете использовать команду докер пс Используйте для проверки того, все ли работает так, как ожидалось.
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
Теперь вы можете запустить Kibana в веб-браузере, введя :5601 Открыть в адресной строке.
С именем пользователя эластичный и пароль, ранее сохраненный в файле .env Вы решили войти в систему.
Если вы видите эту страницу при входе в систему, нажмите “Исследовать самостоятельно”.
Теперь вы можете получить доступ к домашней странице Kibana. Она выглядит так:

Шаг 3 – Logstash
Теперь пришло время добавить последний элемент пазла — Logstash. Logstash может анализировать логи ваших приложений и передавать результаты анализа в Elasticsearch.
docker-compose.yaml Отредактируйте и добавьте четвертый контейнер в разделе “Сервисы” в разделе “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.confНастройка Logstash немного сложнее. Вам понадобится дополнительный файл конфигурации logstash.conf. Logstash работает по принципу конвейера. Это файл, описывающий действия Logstash (откуда берутся логи, как их анализировать и куда их отправлять). Конвейер будет находиться в файле logstash.conf.
Это одна из самых основных линий вещей, которые вы можете иметь:
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 { }
}Всё довольно понятно. В качестве входных данных он принимает файл (в данном случае /var/log/dpkg.log), а вывод отправляет в Elasticsearch и stdout.
Поместите приведенный выше пример в файл logstash.conf.
Каталог elk-stack теперь должен содержать следующие файлы:
elk-stack/
├── .env
├── docker-compose.yaml
└── logstash.confТеперь вы можете запустить Logstash с помощью следующей команды:
docker compose up -d
Выход:
[+] 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 RunningТеперь вы можете получить доступ к Logstash из Kibana. Для начала вам нужно создать представление данных Logstash.
Перейдите на страницу «Обзор аналитики». Вы должны увидеть что-то вроде этого:
Создайте представление данных, нажав кнопку “Создать представление данных”:
После сохранения представления данных вы сможете увидеть отчеты, поступающие из Logstash:

Шаг 4 — Уничтожить стек
Наконец, чтобы остановить стек и удалить контейнеры, выполните следующую команду:
docker compose down
Выход:
[+] 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 RemovedРезультат
У вас должен быть запущен стек ELK с Docker Compose. Далее нужно добавить генераторы отчётов, например Filebeat, или ознакомиться с официальной документацией.
















