今天记录一下在使用docker-compose构建ELK集成环境时遇到的坑,废话不多说了直接来踩坑。
docker网络冲突
在修改好ELK的docker-compose.yml配置文件后,尝试启动遇到网络冲突的问题,错误提示说”172.18.0.1”这个网络已经存在。
|
|
找到冲突的地方就好办,两种方式来解决:
- 删除已经存在的网络
- 更换docker-compose现有的网段
因为这个容器对我还有其他用处,所以这里我选择更换docker-compose的网络来解决
logstash-output-elasticsearch插件的host配置不支持特殊符号
下面是我的docker-compose.yml配置文件(篇幅原因,这里省略了一部分,只是用了ES的容器配置举例)。
docker-compose.yml配置文件链接:
|
|
如果ES容器的container_name配置为”elasticsearch_5.x”,那么logstash需要在logstash.conf配置文件中使用host来指定ES的服务器为”elasticsearch_5.x”,配置如下:
|
|
启动Logstash之后,会如下报错
|
|
提示是”elasticsearch_5.x”是一个非法的URI地址,将docker-compose.yml配置文件的container_name和logstash.conf的host配置修改为”elasticsearch5x”之后就不会再报错了。所以推断logstash-output-elasticsearch插件对host要求比较严格,不支持一些特殊符号。
docker-compose配置的容器无法全部正常启动
使用docker-compose启动ELK的2.x版本服务都一切正常,但是换成ELK的5.x版本后,发现Filebeat,Logstash,Redis,Kibana服务都正常,只有ES的容器起来没有多久就自己挂掉了。
看了ES的日志也没有发现什么异常,单独启动ES5.x的容器却能正常使用。
后来实在没办法了,我尝试在docker-compose.yml配置文件中只留下ES的容器,这样运行也没问题。之后尝试一个一个将其他容器的配置加到docker-compose.yml配置文件,发现当Logstash5.x和ES5.x的容器同时启动,ES的容器就会出现上面自己挂掉的情况。
然后我又仔细查看了一下ES的日志文件,发现了一些区别:有问题的ES日志中多了一些GC的日志。
- 有问题的ES日志
|
|
- 没有问题的ES日志
|
|
经过上面的分析,我怀疑是我docker服务设置的内存大小无法支持我启动这么多的容器。后来发现ES和Logstash的5.x版本比2.x版本多了一个jvm.options的配置文件,主要是用来设置ES和Logstash的JVM的配置使用的,在这个配置文件里可以控制JVM的堆大小。这里将ES和Logstash的堆内存调小后,再使用docker-compose启动,ES5.x的容器已经能够正常启动了。
ES的jvm.options
|
|
Logstash的jvm.options
|
|
参考文章: