【问题标题】:docker-elk - how is it persisting elasticsearch index?docker-elk - 它如何保持弹性搜索索引?
【发布时间】:2018-05-20 06:34:19
【问题描述】:

我刚刚开始掌握 Docker 和 docker-compose,正在尝试为 Elasticsearch 创建一个开发环境,稍后我将进行部署。

我一直使用docker-elk 作为参考,并且我已经成功地创建了一个有效的 Elasticsearch 容器,将其植入并在我的项目中使用它。

据我了解,Docker 容器不会保留数据,除非您使用 Volumes API 并在容器外部创建一个卷,然后容器将访问该卷(阅读 here)。

然而 docker-elk 只使用 Volumes 来共享一个配置 yml 文件,但不知何故,当我再次启动容器时,我的弹性索引仍然存在。

来自 docker-elk 自述文件:

存储在 Elasticsearch 中的数据 将在容器重新启动后保留,但在容器后不会保留 删除。

谁能解释一下下面配置的哪一部分允许 docker 容器持久化索引?

docker-compose.yml

version: '2'

services:
  elasticsearch:
    build:
      context: build/elasticsearch/
    volumes:
      - ./build/elasticsearch/config.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - elk

networks:
  elk:
    driver: bridge

构建/elasticsearch/Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.0.0

build/elasticsearch/config.yml

cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
discovery.type: single-node

【问题讨论】:

    标签: docker elasticsearch docker-compose elastic-stack


    【解决方案1】:

    您可能知道,容器就是沙盒。它有一个文件系统,其结构与典型的 linux 操作系统非常相似。容器只能看到该文件系统中的那些文件和文件夹。

    容器内运行的进程将其数据和配置写入此文件系统中的文件。此进程不知道它是在容器中还是在 VM 上运行。因此,数据保存在该文件系统的文件和文件夹中。

    现在,当您使用docker rm ...删除容器时,这些文件将随容器一起删除,因此您会丢失数据,除非您使用在主机上备份此数据的卷。

    另一方面,停止和启动容器不会删除容器文件,因此当您重新启动容器时数据仍然存在。

    【讨论】:

    • 感谢您的回答,我仍然感到困惑的是,当我直接使用 Dockerfile 并使用 docker build -t elasticsearch .docker run -p 9200:9200 -p 9300:9300 elasticsearch 时,索引在重新启动容器时不会持续存在,所以使用改变了什么码头工人撰写?
    • @daviestar 你用什么命令重启容器?
    • 只是第二个命令 - docker run -p 9200:9200 -p 9300:9300 elasticsearch
    • 这不是容器重启。每次运行此命令时,您都在创建一个具有自己文件系统的全新容器。重启是docker stop <container-name>,然后是docker start <container-name>
    • @daviestar 当您运行docker-compose up 时,如果它在同一个撰写文件上从先前的docker-compose up 命令中找到一个已经存在的容器,它不会创建新容器。这就是保持索引“持久化”的原因。
    【解决方案2】:

    可以使用以下命令观察索引及其在UUID中的映射。

    curl 'localhost:9200/_cat/indices?v'
    

    【讨论】:

      【解决方案3】:

      补充已接受的答案,适用于正在寻找如何持久化数据的任何人。如问题中所述添加volume

      version: '3'
      
      services:
        
        elasticsearch: # Elasticsearch Instance
          container_name: es-search
          image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
          volumes: # Persist ES data in seperate "esdata" volume
            - esdata:/usr/share/elasticsearch/data
          environment:
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
            - discovery.type=single-node
          ports: # Expose Elasticsearch ports
            - "9300:9300"
            - "9200:9200"
      
      volumes: # Define seperate volume for Elasticsearch data
        esdata: ./my/esdata # path of your persisted data here
      

      我在这里找到了弹性 docker 指南:https://blog.patricktriest.com/text-search-docker-elasticsearch/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2018-07-22
        • 2020-07-20
        相关资源
        最近更新 更多