1、目前日志总量不是很大,所以我只是通过docker-compose将ELK容器指定运行在一个节点,部署在了一台主机上面。可以按照需求将容器分别部署在三台主机上面、不过要注意相应的容器所需的物理卷的挂载位置也要在相对应的主机上面。
docker-compose.yml
version: "3"
services:
elasticsearch: #服务name
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.6 #指定elasticsearch使用的版本镜像,可根据自己的需求更改
environment: #elasticsearch容器启动的系统环境
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node #单节点运行
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms16g -Xmx16g" #JAVA的内存大小
ulimits: #集群运行,该配置无实际意义,可忽略
memlock:
soft: -1
hard: -1
volumes: #挂载相应本地存储目录存储数据,挂载配置文件
- ./esdata/data:/usr/share/elasticsearch/data #将本地文件存储和容器目录映射
- ./esdata/logs:/user/share/elasticsearch/logs
- ./esdata/plugins:/usr/share/elasticsearch/plugins
- ./elk-config/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports: #容器与外部服务器的端口映射
- 9200:9200
- 9300:9300
networks: #指定固定IP地址,但是运行后没有生效,没找到原因,暂时放弃
esnet:
ipv4_address: 10.0.18.3
deploy:
replicas: 1
placement:
constraints:
- node.hostname==docker-worker02 #指定在docker-swarm的那个主机节点运行
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
logstash:
image: docker.elastic.co/logstash/logstash:6.8.6
ports:
- '9044:9044'
volumes:
- ./elk-config/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
- ./elk-config/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./logdata:/usr/share/logstash/data
networks:
- esnet
deploy:
replicas: 1
placement:
constraints:
- node.hostname==docker-worker02
kibana:
image: docker.elastic.co/kibana/kibana:6.8.6
volumes:
- ./elk-config/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- '5601:5601'
networks:
- esnet
depends_on: #依赖服务
- elasticsearch
deploy:
replicas: 1
placement:
constraints:
- node.hostname==docker-worker02
headPlugin:
image: 'mobz/elasticsearch-head:5'
container_name: head
ports:
- '9100:9100'
networks:
- esnet
deploy:
replicas: 1
placement:
constraints:
- node.hostname==docker-worker02
networks:
esnet:
ipam:
config:
- subnet: 10.0.18.0/24
2、运行docker-compose文件前先创建相应的的目录和配置文件
Mkdir /esdata/data #elasticsearch的数据存储目录
Mkdir /esdata/logs #elasticsearch的日志
Mkdir /esdata/plugins
Mkdir /logdata/dnslog #远程sftp服务器下载的dns日志
Mkdir /elk-config #elasticsearch logstash kibana的配置文件
因为elasticsearch产生数据、需要给相应的文件目录写入权限
Chmod 775 /esdata/data
Chmod 775 /esdata/logs
Chmod 775 /logdata
3、在docker swarm管理节点上创建docker-compose.yml文件,写入docker-compose具体的代码数据
4、运行docker-compose.yml文件、部署服务
docker stack deploy -c docker-compose.yml elk
5、docker stack及docker容器操作的常用基本命令
1) docker stsack deploy
用于根据 Stack 文件(通常是 docker-stack.yml)部署和更新 Stack 服务的命令。
2) docker stack ls
会列出 Swarm 集群中的全部 Stack,包括每个 Stack 拥有多少服务。
3) docker stack ps
列出某个已经部署的 Stack 相关详情。该命令支持 Stack 名称作为其主要参数,列举了服务副本在节点的分布情况,以及期望状态和当前状态。
4) docker stack rm
命令用于从 Swarm 集群中移除 Stack。移除操作执行前并不会进行二次确认。
5)docker ps
显示目前运行的容器信息,容器ID
6)docker inspect 容器ID |grep IPAddress
获取容器的IP地址
6、在docker-swarm管理节点使用docker stack命令运行docker-compose是将容器服务运行在整个集群上面,因为ELK有存储数据的需求,因此在docker-compos文件里面,将ELK指定在了worker02节点即(172.16.10.12)服务器上面运行,所以在172.16.10.12上面挂载硬盘。硬盘挂载配置请参考《虚拟机的配置调整》
7、查看elasticsearch的容器IP地址、并修改kibana、logstash配置文件内的elasticsearch的地址后重新加载容器服务
1)、查看容器ID:dockers ps
2)查看elasticsearch的容器IP地址:
docker inspect 容器ID |grep IPAddress
3)修改kibana.yml和logstash.conf的elasticsearch的地址为上面查询到的地址
4)重新加载kibana、logstash服务
8、看到各个容器正常启动,ELK部署完成。启动异常过程可以查看容器启动日志
9、启动完成后可以尝试浏览器访问:172.16.10.12:9200、172.16.10.12:9100 、172.16.10.12:5600
验证服务正常部署完成
参考链接:https://github.com/deviantony/docker-elk
https://www.cnblogs.com/wenhuazzz/p/12055747.html
https://blog.csdn.net/CaptainJava/article/details/106879295
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/docker.html