简而言之 - 我可以在单独的docker容器中运行Elasticsearch&Dropwizard应用程序并允许它们相互查看吗?
我从Docker运行Elasticsearch 6.2.2(在mac上)。使用命令..
docker run -p 9200:9200 -p 9300:9300 -e "network.host=0.0.0.0" \
-e "http.port=9200" -e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:6.2.2
我可以直接在Mac上使用Postman访问Elasticsearch(POST和GET)
localhost:9200/testindex/_search
但是,当从访问docker Elasticsearch实例的其他docker镜像运行Dropwizard应用程序时,我使用相同的主机和端口(localhost 9200)拒绝连接。
当直接从IDE运行Dropwizard应用程序时,我没有任何问题,只有当它从docker镜像运行并从另一个图像访问ES时。
docker image -p 8080:8080 -p 8081:8081测试应用
有没有其他人有类似的问题或过去解决过这个问题?我假设它与'网络'相关,并且从一个docker镜像连接到localhost将不会映射到另一个docker镜像
您遇到的问题是您传递给dropwizard容器的URL。由于默认情况下容器具有自己的网络,因此值localhost
表示dropwizard容器本身,而不是您从容器外部看到的本地主机。
请查看docker网络,如何按名称链接两个容器。我建议在本地机器上查看docker-compose进行多容器设置。
什么也可行(但不是很好的做法)是将dropwizard容器作为elasticsearch主机传递给你的机器的ip,因为你创建了一个从主机到elasticsearch容器的端口映射。但最好还是看看compose做它应该做的事情。
有关如何使用compose的详细信息,请查看this answer with a similar example。