从docker容器连接到主机elasticsearch运行实例

我有这个简单的设置:Dockerfile:

FROM centos:latest RUN yum update -y RUN yum install -y epel-release RUN yum install -y java-1.8.0-openjdk RUN yum install -y curl RUN mkdir /var/totest EXPOSE 9200 EXPOSE 9300 

在主机上我有一个运行的elasticsearch 5.4.2实例。

当我在主机上curl http:// localhost:9200时,我得到正确的回应:

  { "name" : "T8apV_J", "cluster_name" : "elasticsearch", "cluster_uuid" : "YFkkaM8dSJCnXbDFRFD_aw", "version" : { "number" : "5.4.2", "build_hash" : "929b078", "build_date" : "2017-06-15T02:29:28.122Z", "build_snapshot" : false, "lucene_version" : "6.5.1" }, "tagline" : "You Know, for Search" } 

但是,如果我build立docker图像,我运行

 docker run -p 9200:9200 -it my-simple-image /bin/bash 

我得到这个错误:

 docker: Error response from daemon: driver failed programming external connectivity on endpoint infallible_brown (71c6fae1275d149b2708a1aa9b737278d340c4e7b073d858b4222eb0268ef285): Error starting userland proxy: listen tcp 0.0.0.0:9200: bind: address already in use. 

如何从docker容器内部连接到运行elasticsearch实例的主机?

我所需要的是能够从容器内部执行

curl http:// localhost:9200 / index_name / _search

您需要删除EXPOSE 9200中的EXPOSE 9200指令,因为弹性search服务已经使用端口号9200。

你应该curl你的主机的IP地址。 Docker将容器连接到bridgenetworking,以便您开始获取主机的IP地址。

您可能需要根据主机是否连接到更广泛的networking来设置别名。 我为我的bridge0接口设置了这个别名。

 sudo ifconfig bridge0 alias <ip_address> 

如果您的主机连接到更广泛的networking,请使用分配给您的以太网设备的inet地址。 您可以运行以下命令获取inet地址:

 ifconfig en0 | grep "inet " | cut -d " " -f2 

您可以将networking接口的inet地址作为环境variables传递给docker:

 docker run -e MY_HOST_IP=$(ip_address) -it my-simple-image /bin/bash # or docker run -e MY_HOST_IP=$(ifconfig en0 | grep "inet " | cut -d " " -f2) -it my-simple-image /bin/bash curl $MY_HOST_IP:8000 

看到这个线程获取更多关于你的问题的信息

弹性search使用端口9200.现在,您想要将端口9200从容器发布到本地主机。 您不能让两个应用程序在本地主机的相同端口上侦听。