مقدمة
في هذا الدرس التعليمي، ستتعلم كيفية تثبيت حزمة ELK باستخدام Docker Compose على خادم يعمل بنظام Ubuntu (الإصدار 22.04). تتكون حزمة ELK من Elasticsearch وKibana وLogstash.
- Elasticsearch هو محرك بحث وتحليل.
- كيبانا هي واجهة مستخدم لتحليل البيانات.
- يستطيع Logstash تحليل السجلات المتعلقة بالتطبيقات.
المتطلبات الأساسية
- خادم يعمل بنظام Ubuntu 22.04 أو أحدث: إمكانية الوصول إلى هذا الخادم عبر SSH، وإمكانية الوصول إلى حساب المستخدم الجذر أو حساب المستخدم ذي صلاحيات 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 (أي يُشغّل البرنامج النصي المُنزّل ويُثبّت 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. يُستخدم هذا الملف لتخزين البيانات السرية مثل كلمات المرور ورموز API، وذلك لإزالتها من إعداداتك أو شفرتك البرمجية. يكتشف Docker Compose ملف .env تلقائيًا ويستبدل المتغيرات مثل ${MY_VARIABLE} بمتغير البيئة.
أنشئ بيئة وأضف الأسطر التالية:
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يمكنك استخدام الأمر docker ps استخدمه للتحقق مما إذا كان كل شيء يعمل كما هو متوقع.
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 أو مراجعة الوثائق الرسمية.
















