通过docker compose一次性部署Elasticsearch、Filebeat、Kibana。
docker pull store/elastic/filebeat:7.6.2
docker pull elasticsearch:7.6.2
docker pull kibana:7.6.2
为了更好理解docker编排文件下filebeat和kibana的配置方法,这里的Elasticsearch使用双节点部署。实际生产环境不会这样配置Elasticsearch集群。(官方的集群样例,请参考这里:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)
version: '3'
services:
es01:
image: elasticsearch:7.6.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: elasticsearch:7.6.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
filebeat:
image: store/elastic/filebeat:7.6.2
container_name: filebeat
user: root
environment:
- strict.perms=false
- output.elasticsearch.hosts=["es1:9200"]
volumes:
- ./filebeat.docker-compose.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock
networks:
- elastic
depends_on:
- es01
kibana:
image: kibana:7.6.2
container_name: kibana
environment:
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
expose:
- "5601"
ports:
- "5601:5601"
depends_on:
- es01
volumes:
data01:
driver: local
data02:
driver: local
networks:
elastic:
driver: bridge
1)Docker Compose文件里创建两个节点的Elasticsearch集群。节点es01在本地主机上监听9200端口,es02通过Docker网络与es01对话。
2)volumes data01和data02是的Docker存储节点数据目录,以便数据在重新启动时保持不变。如果目录不存在,docker compose会在您启动集群时创建它们(如果不指定位置,默认位于/var/lib/docker/volumes/
目录下)。
3)Filebeat和Kibana的配置里均需要把Elasticsearch的host改成集群里监听9200端口的es01。
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
processors:
- add_cloud_metadata: ~
output.elasticsearch:
hosts: '${ELASTICSEARCH_HOSTS:es01:9200}'
这个文件同样使用官方标准配置,但最后一行host需要改为Elasticesearch集群里监听9200端口的容器的容器名。
出错信息如下:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
这是由于默认vm.max_map_count=65530
,因此缺省配置下,单个jvm能开启的最大线程数为其一半,即3w左右,大概32k的量。所以要调大到262144。(确保宿主机内存大于4G的情况下)
echo vm.max_map_count=262144 >> /etc/sysctl.conf && sysctl -p
检查配置是否生效:
#cat /proc/sys/vm/max_map_count
262144
Docker compose文件内配置,当容器启动后,会在/var/lib/docker/volumes/filebeat_data01/_data/
目录下生成数据并持久化,在每次启动集群时都会复用。如果要删除这些数据,我们需要在停止集群时加上-v参数: docker-compose down -v
运行效果
# docker-compose down -v
Stopping es02 ... done
Stopping es01 ... done
Removing es02 ... done
Removing es01 ... done
Removing network filebeat_elastic
Removing volume filebeat_data02
Removing volume filebeat_data01
如果不使用docker compose同时创建的kibana,加入Elasticsearch集群时,需要指定集群的网络名,以及连接集群中的Elasticsearch监听9200端口的节点名字,例如:
docker run -d --name kibana-cluster --net filebeat_elastic --link es01:elasticsearch -p 5601:5601 kibana:7.6.2