执行docker-compose down后Kibana丢失索引及索引模式问题
问题成因
- Elasticsearch 7.17的索引数据、集群元数据默认存储在容器内部
/usr/share/elasticsearch/data路径,Kibana 7.17保存的索引模式、可视化看板、空间配置等数据默认存储在容器内部/usr/share/kibana/data路径。Docker容器的文件系统是临时分层存储,所有写入容器内部非持久化映射路径的内容,都会在容器被删除时完全清除。 docker-compose down命令的默认逻辑是停止并删除对应compose项目创建的所有服务容器、网络,仅保留显式声明的持久化卷。如果compose配置中没有给上述两个数据路径配置持久化映射,容器删除后所有存储在容器内的数据自然会全部丢失。- 若配置持久化时使用了未指定名称的匿名卷,执行
docker-compose down -v时匿名卷会被同步删除,同样会造成数据丢失。
解决方案
核心是给Elasticsearch、Kibana的内部数据路径配置可靠的持久化存储,推荐使用宿主机目录绑定的方式,方便备份和迁移,具体操作如下:
- 编写正确的docker-compose.yml配置,添加数据卷映射规则,参考配置如下:
version: '3.7' services: elasticsearch: image: elasticsearch:7.17 container_name: es-7.17 environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-node ports: - "9200:9200" - "9300:9300" volumes: - ./es/data:/usr/share/elasticsearch/data - ./es/plugins:/usr/share/elasticsearch/plugins restart: unless-stopped networks: - elk kibana: image: kibana:7.17 container_name: kibana-7.17 depends_on: - elasticsearch ports: - "5601:5601" environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 volumes: - ./kibana/data:/usr/share/kibana/data restart: unless-stopped networks: - elk filebeat: image: elastic/filebeat:7.17 container_name: filebeat-7.17 user: root depends_on: - elasticsearch volumes: - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml - /var/log:/host/var/log:ro restart: unless-stopped networks: - elk networks: elk: driver: bridge
- 在docker-compose.yml同级目录创建所需的存储目录,提前配置权限避免ES启动鉴权失败:
mkdir -p ./es/data ./es/plugins ./kibana/data ./filebeat # 测试环境可直接给777权限,生产环境建议授权给1000:1000的ES运行用户 chmod 777 ./es/data ./kibana/data # 生产环境执行:chown -R 1000:1000 ./es/data ./kibana/data
- 提前编写filebeat配置文件放到
./filebeat/filebeat.yml路径,配置好日志采集规则和Elasticsearch输出地址后,执行docker-compose up -d启动服务。
配置完成后,所有索引数据、Kibana配置都会持久化保存在宿主机的对应目录下,后续不管执行docker-compose down还是重启宿主机,重新启动容器后数据都不会丢失。
注意:如果需要重置环境清空所有数据,手动删除当前目录下的es、kibana文件夹即可,日常操作不要随意加
-v参数执行down命令,避免误删持久化数据。
内容的提问来源于stack exchange,提问作者safae azouzou
相关产品推荐
相关产品推荐

