使用Docker Compose部署ELK(Elasticsearch、Logstash、Kibana)的好处主要体现在以下几个方面:
- 集中管理日志数据:ELK能够帮助业务实现日志数据的集中管理,通过Elasticsearch进行搜集、分析和存储,Kibana为Elasticsearch提供图形化界面,使得日志数据的查看和分析更加直观和便捷。
- 快速搜索和分析:ELK能够快速搜索和分析日志数据,从而提高故障排查的效率,优化系统性能,以及发现潜在的安全威胁。这对于业务运营和决策支持具有重要意义。
- 开源和免费:ELK都是开源软件,可以互相配合使用,完美衔接,高效的满足了很多场合的应用。这降低了部署和使用的成本,同时也提供了更大的灵活性和可定制性。
- 易于扩展和部署:使用Docker Compose部署ELK可以简化部署过程,提高可扩展性和灵活性。通过简单的命令,您可以快速创建和启动一个ELK服务,并根据需要增加更多的节点或代理。
- 跨平台部署:Docker Compose适用于不同的操作系统和云平台。无论您是在本地开发环境还是生产环境中部署ELK,Docker Compose都可以帮助您快速搭建和扩展环境。
总之,使用Docker Compose部署ELK可以简化部署过程,提高可扩展性和灵活性,同时提供集中管理日志数据、快速搜索和分析等功能,对于业务运营和决策支持具有重要意义。
1. 安装docker
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动docker
systemctl start docker
systemctl enable docker
2. 安装docker compose
因github为国外源,可能会出现下载失败或下载速度很慢的情况。可自行从别的渠道下载,拷贝到相应目录并赋予可执行权限即可
sudo curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
3. 编辑docker-compose.yml
mkdir -p /home/elk
cd /home/elk
vi docker-compose.yml
version: '3.8'
services:
es01:
depends_on:
- jdk17
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
container_name: es01
restart: always
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_providers=file
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms3g -Xmx3g"
- http.cors.enabled=true
- http.cors.allow-origin=*
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
depends_on:
- jdk17
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
container_name: es02
restart: always
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_providers=file
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms3g -Xmx3g"
- http.cors.enabled=true
- http.cors.allow-origin=*
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- elastic
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200"]
interval: 30s
timeout: 10s
retries: 5
es03:
depends_on:
- jdk17
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
container_name: es03
restart: always
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_providers=file
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms3g -Xmx3g"
- http.cors.enabled=true
- http.cors.allow-origin=*
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
ports:
- 9202:9200
networks:
- elastic
jdk17:
image: openjdk:17
container_name: jdk17
restart: always
networks:
- elastic
kibana:
depends_on:
- es01
- es02
- es03
image: docker.elastic.co/kibana/kibana:7.17.0
container_name: kibana
restart: always
privileged: true
volumes:
- kibana_certs:/usr/share/kibana/config/certs
- kibana_data:/usr/share/kibana/data
networks:
- elastic
ports:
- 5601:5601
deploy:
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 5
environment:
ELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200","http://es03:9200"]'
I18N_LOCALE: zh-CN
healthcheck:
test:
[
"CMD-SHELL",
"curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
]
interval: 10s
timeout: 10s
retries: 120
cerebro:
image: lmenezes/cerebro:0.9.4
container_name: cerebro
restart: always
ports:
- "9101:9000"
command:
- -Dhosts.0.host=http://es01:9200
- -Dhosts.1.host=http://es01:9200
- -Dhosts.2.host=http://es01:9200
networks:
- elastic
eshead:
image: alvinos/elasticsearch-head
container_name: eshead
restart: always
ports:
- '9100:9100'
networks:
- elastic
portainer:
image: portainer/portainer:latest
container_name: portainer
hostname: portainer
restart: always
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- portainer_data:/data
- portainer_public:/public
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "9000:9000"
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
kibana_certs:
driver: local
kibana_data:
driver: local
portainer_data:
driver: local
portainer_public:
driver: local
networks:
elastic:
driver: bridge
4.启动容器
需要进入docker-compose.yml文件所在目录进行操作
cd /home/elk
docker-compose up -d #创建容器并启动服务,如果镜像不存在时,会自动下载镜像
docker-compose down #关闭整个项目并移除容器、移除网络、不会移除数据卷,删除项目不会丢失mysql数据
docker-compose stop #停止容器服务
docker-compose start #启动容器服务
docker-compose restart #重启整个项目
docker-compose logs #查看容器日志
以上命令可以通过加服务名称管理指定的服务,比如docker-compose stop es01表示只停止es01容器
5. 报错异常处理
报错:max virtual memory areas vm. max_map_count [65530] is too low, increase to at least [262144]
现象:Elasticsearch数据库启动异常,9200无法访问
原因:Elasticsearch数据库运行需要大量内存,而你的系统中的vm.max_map_count值过低,无法满足程序的需求。
解决方法如下:
#临时,立即生效
sysctl -w vm.max_map_count=262144
#永久生效
vi /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p #使配置生效
6.web访问
#elk页面访问地址:无需密码,可直接访问
http://ip:5601
#Elasticsearch数据库地址:
http://ip:9200
#Elasticsearch数据库管理地址:
http://ip:9100
#docker容器管理地址:
http://ip:9000