文章524
标签277
分类67

使用Docker-Compose部署单节点ELK

最近在学习Go中集成ELK,需要搭建至少单节点的ELK服务,就用ElasticSearch官方的镜像和Docker-Compose创建了单节点的ELK;

本文讲述了如何使用Docker-Compose部署单节点ELK,使用的版本为7.1.0,当然也适用于其他版本的搭建;

源代码:

系列文章:


使用Docker-Compose部署单节点ELK

前言

部署环境为:

  • 操作系统:CentOS 7
  • Docker:20.10.6
  • Docker-Compose:1.29.1
  • ELK Version:7.1.0

注:本篇仅仅采用通常的ElasticSearch + LogStash + Kibana组件,而未使用FileBeat;


项目说明

首先,在配置文件.env中声明了ES以及各个组件的版本:

.env

1
ES_VERSION=7.1.0

其次,创建Docker-Compose的配置文件:

docker-compose.yml

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
version: '3.4'

services:
elasticsearch:
image: "docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSION}"
environment:
- discovery.type=single-node
volumes:
- /etc/localtime:/etc/localtime
- /docker_es/data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"

logstash:
depends_on:
- elasticsearch
image: "docker.elastic.co/logstash/logstash:${ES_VERSION}"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
links:
- elasticsearch

kibana:
depends_on:
- elasticsearch
image: "docker.elastic.co/kibana/kibana:${ES_VERSION}"
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
volumes:
- /etc/localtime:/etc/localtime
ports:
- "5601:5601"
links:
- elasticsearch

在Services中声明了三个服务:

  • elasticsearch;
  • logstash;
  • kibana;

在elasticsearch服务的配置中有几点需要特别注意:

  • discovery.type=single-node:将ES的集群发现模式配置为单节点模式;
  • /etc/localtime:/etc/localtime:Docker容器中时间和宿主机同步;
  • /docker_es/data:/usr/share/elasticsearch/data:将ES的数据映射并持久化至宿主机中;

在启动ES容器时,需要先创建好宿主机的映射目录;

并且配置映射目录所属,例如:

1
sudo chown -R 1000:1000 /docker_es/data

否则可能报错!

见:

在logstash服务的配置中有几点需要特别注意:

  • ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:将宿主机本地的logstash配置映射至logstash容器内部;

在kibana服务的配置中有几点需要特别注意:

  • ELASTICSEARCH_URL=http://elasticsearch:9200:配置ES的地址;
  • /etc/localtime:/etc/localtime:Docker容器中时间和宿主机同步;

下面是LogStash的配置,在使用时可以自定义:

logstash.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json
}
}

output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{[service]}-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}

使用方法

使用前必看:

① 修改ELK版本

可以修改在.env中的ES_VERSION字段,修改你想要使用的ELK版本;

② LogStash配置

修改logstash.conf为你需要的日志配置;

③ 修改ES文件映射路径

修改docker-compose中elasticsearch服务的volumes,将宿主机路径修改为你实际的路径:

1
2
3
4
volumes:
- /etc/localtime:/etc/localtime
- - /docker_es/data:/usr/share/elasticsearch/data
+ - [your_path]:/usr/share/elasticsearch/data

并且修改宿主机文件所属:

1
sudo chown -R 1000:1000 [your_path]

随后使用docker-compose命令启动:

1
2
3
4
5
docker-compose up -d
Creating network "docker_repo_default" with the default driver
Creating docker_repo_elasticsearch_1 ... done
Creating docker_repo_kibana_1 ... done
Creating docker_repo_logstash_1 ... done

在portainer中可以看到三个容器全部被成功创建:

访问<ip>:5601/可以看到Kibana也成功启动:


测试

通过API进行数据的CRUD

向ES中增加数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
curl -XPOST "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"  -H "Content-Type: application/json" -d ' 
{
"id" : 3,
"username" : "测试测试",
"description" : "测试测试"
}'

# 返回
{
"_index" : "ik_v2",
"_type" : "chinese",
"_id" : "3",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}

获取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -XGET "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"

# 返回
{
"_index" : "ik_v2",
"_type" : "chinese",
"_id" : "3",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"id" : 3,
"username" : "测试测试",
"description" : "测试测试"
}
}

修改数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
curl -XPOST 'localhost:9200/ik_v2/chinese/3/_update?pretty' -H "Content-Type: application/json" -d '{ 
"doc" : {
"username" : "testtest"
}
}
}'

# 返回
{
"_index" : "ik_v2",
"_type" : "chinese",
"_id" : "3",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}

再次查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -XGET "http://127.0.0.1:9200/ik_v2/chinese/3?pretty"

# 返回
{
"_index" : "ik_v2",
"_type" : "chinese",
"_id" : "3",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"id" : 3,
"username" : "testtest",
"description" : "测试测试"
}
}

可以看到,username已经成功被修改!


在Kibana中查看

目前我们的Kibana中是不存在Index索引的,需要先创建;

在Management中点击Kibana下面的Index Management,并输入上面我们插入的索引ik_v2:

创建成功后可以在Discover中查看:

大体单节点的ELK就部署成功,可以使用了!


附录

源代码:

系列文章:



本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/cn/2021/05/15/%E4%BD%BF%E7%94%A8Docker-Compose%E9%83%A8%E7%BD%B2%E5%8D%95%E8%8A%82%E7%82%B9ELK/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可