docker-elk - 它是如何持久化 elasticsearch 索引的?

docker-elk - how is it persisting elasticsearch index?

我刚刚开始掌握 Docker 和 docker-compose,试图为 Elasticsearch 创建一个开发环境,我稍后会部署它。

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

据我了解,Docker 容器不会持久保存数据,除非您使用卷 API 并在容器外部创建一个容器随后访问的卷(阅读 here).

但是 docker-elk 仅使用 Volumes 来共享一个配置 yml 文件,但不知何故,当我将容器上下移动时,我的弹性指数仍然存在。

来自 docker-elk 自述文件:

The data stored in Elasticsearch will be persisted after container reboot but not after container removal.

有人可以解释以下配置的哪一部分允许 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

build/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

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

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

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

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

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

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

作为已接受答案的补充,适用于正在寻找如何持久保存数据的任何人。添加问题中提到的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/