我对 Docker 和 ElasticSearch 都很陌生。我正在遵循教程并使用此 docker compose 文件来安装 ElasticSearch:
version: "4.6"
services:
es01:
image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2"
ports:
- "9200:9200"
- "9300:9300"
environment:
node.name: es01
discovery.seed_hosts: es01,es02,es03
cluster.initial_master_nodes: es01,es02,es03
cluster.name: mycluster
bootstrap.memory_lock: "true"
ES_JAVA_OPTS: -Xms256m -Xmx256m
volumes:
- "es-data-es01:/usr/share/elasticsearch/data"
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
es02:
image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2"
ports:
- "9201:9200"
- "9301:9300"
environment:
node.name: es02
discovery.seed_hosts: es01,es02,es03
cluster.initial_master_nodes: es01,es02,es03
cluster.name: mycluster
bootstrap.memory_lock: "true"
ES_JAVA_OPTS: -Xms256m -Xmx256m
volumes:
- "es-data-es02:/usr/share/elasticsearch/data"
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
es03:
image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2"
ports:
- "9202:9200"
- "9303:9300"
environment:
node.name: es03
discovery.seed_hosts: es01,es02,es03
cluster.initial_master_nodes: es01,es02,es03
cluster.name: mycluster
bootstrap.memory_lock: "true"
ES_JAVA_OPTS: -Xms256m -Xmx256m
volumes:
- "es-data-es03:/usr/share/elasticsearch/data"
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
kibana:
image: docker.elastic.co/kibana/kibana-oss:7.10.2
depends_on:
es01:
condition: service_healthy
es02:
condition: service_healthy
es03:
condition: service_healthy
ports:
- "5601:5601"
environment:
- 'ELASTICSEARCH_HOSTS=["http://es01:9200","http://es02:9200","http://es03:9200"]'
volumes:
es-data-es01:
es-data-es02:
es-data-es03:
运行 docker compose 时出现
FileSystemException
错误:
api-es03-1 | "stacktrace": ["org.elasticsearch.bootstrap.StartupException: ElasticsearchException[failed to bind service]; nested: FileSystemException[/usr/share/elasticsearch/data/nodes/0: Not a directory];",
api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127) ~[elasticsearch-cli-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "Caused by: org.elasticsearch.ElasticsearchException: failed to bind service",
api-es03-1 | "at org.elasticsearch.node.Node.<init>(Node.java:729) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.node.Node.<init>(Node.java:289) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:227) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:227) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:393) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.10.2.jar:7.10.2]",
api-es03-1 | "... 6 more",
我期待弹性搜索服务器能够顺利运行。
这显然是安装路径问题。
简单来说,容器和宿主机应该交换数据。这是通过以下方式完成的:
匿名卷:容器停止时销毁,不是永久的。
命名卷:可以命名但不能指定路径。您可以通过以下方式找到路径:
docker volume inspect volume-name
bind-mount: 与命名卷几乎相同,但您指定路径。
以及你在容器中交换数据的地方,例如:
es-data-es03:/usr/share/elasticsearch/data
这意味着,您的主机之间应该在该文件上进行数据交换:es-data-es03和容器本身:/usr/share/elasticsearch/data 这可以确保即使您的容器关闭,您也可以在 es-data-es03 处获得数据。
但是你的错误表明:
FileSystemException[/usr/share/elasticsearch/data/nodes/0:不是目录]
这意味着您需要一个文件夹而不是文件。我检查了你的坐骑,它们都是一样的。某处可能存在损坏的卷文件。我会删除所有容器和卷并从头开始。
docker ps -a // Show all active and inactive containers
docker rm container-name // Remove container one by one
docker volume ls // Show all volumes
docker volume prune // Remove all unused volumes
docker volume rm volume-name // Remove volume by name
如果容器启动,您可以使用以下命令进入容器:
docker exec -it container-name bash
并检查文件。但它应该正在运行。