下面的docker-compose YAML文件在与docker compose
命令一起使用时会产生一个3节点的Elasticsearch集群。这对于调试来说是可以的,但是我想移动到部署,所以我想在一个容器可以在不同系统上运行的群上部署。
所以
docker compose up
可以,但是
docker stack deploy -c docker-compose.yml p3es
创建了相同的容器(尽管在不同的系统上)和覆盖网络,但elasticsearch示例无法通过矶钓9300相互通信。因此,不会分配主服务器,尽管elasticsearch响应HTTP请求,但它们只是出错。
在日志中,每个容器上都会显示以下异常/堆栈跟踪:
p3es_es01.1.sv26uqp4i4s3@carbon | "stacktrace": ["org.elasticsearch.transport.RemoteTransportException: [es03][10.0.12.9:9300][internal:cluster/coordination/join]",
p3es_es01.1.sv26uqp4i4s3@carbon | "Caused by: org.elasticsearch.transport.ConnectTransportException: [es01][10.0.0.53:9300] connect_exception",
(etc)
异常的原因原来是:
p3es_es01.1.sv26uqp4i4s3@carbon | "Caused by: java.io.IOException: connection timed out: 10.0.0.53/10.0.0.53:9300",
下面是我尝试过的一些方法:
1.我在其中一个容器上调用一个shell,我可以ping其他每个容器,我也可以在每个容器上执行curl -XGET
,并从端口9200获得响应。
1.如果我在其中一个容器的端口9300上执行curl -XGET,我会得到一个“不是HTTP端口”的消息,但至少它能够解析地址。
- Docker堆栈喜欢在对象的名称上加上前缀。所以如果你把一个网络命名为xyz,那么这个网络实际上会被命名为project_xyz。所以我修改了告诉elasticsearch谁是集群的一部分的环境变量,以包括项目名称前缀。没有运气。
我没办法了。有什么建议吗?
version: '3.9'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
environment:
- HOSTNAME=es01
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- es9300
volumes:
- nfs-es01:/usr/share/elasticsearch/data
ports:
- 9200:9200
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
environment:
- HOSTNAME=es02
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- es9300
volumes:
- nfs-es02:/usr/share/elasticsearch/data
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
environment:
- HOSTNAME=es03
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- es9300
volumes:
- nfs-es03:/usr/share/elasticsearch/data
volumes:
nfs-es01:
driver_opts:
type: nfs
o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
device: :/sbn/process3/elasticsearch01
nfs-es02:
driver_opts:
type: nfs
o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
device: :/sbn/process3/elasticsearch02
nfs-es03:
driver_opts:
type: nfs
o: addr=10.2.0.1,rw,nfsvers=4,local_lock=all
device: :/sbn/process3/elasticsearch03
networks:
es9300:
driver: overlay
attachable: true
1条答案
按热度按时间wlp8pajw1#
事实证明,当Docker为Elasticsearch发现提供多个覆盖网络时,它会感到困惑。
导致每个
es0*
服务在指定的覆盖网络(在本例中为es9300
)* 之外 * 的入口覆盖网络上。由于某些原因,当Elasticsearch在容器中运行时,它在解析服务/DNSes01
时获得错误的IP地址。我还没有确定为什么会这样,但是删除发布端口9200的端口指令可以解决这个问题。
希望这篇文章能帮助遇到同样问题的人。