从docker容器连接到host elasticsearch runing instance

时间:2017-07-19 15:18:21

标签: docker dockerfile

我有这个简单的设置: 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。

当我在主持人卷曲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"
}

但是,如果我构建了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

3 个答案:

答案 0 :(得分:0)

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

您应该curl使用主机的IP地址。 Docker将容器附加到bridge网络以便开始,因此您需要一种方法来获取主机的IP地址。

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

sudo ifconfig bridge0 alias <ip_address>

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

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

您可以将网络接口的inet地址作为环境变量传递给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

See this thread for more information about your question

答案 1 :(得分:0)

弹性搜索使用端口9200.现在您要将端口9200从容器发布到localhost。您不能让两个应用程序在localhost的同一端口上进行侦听。

答案 2 :(得分:0)

这里有一个快速的技巧来使其正常工作。通过curl -X GET 'http://0.0.0.0:9200'可在主机上访问Elastic,我认为docker run --net host --name your_app将允许容器的应用查询在主机上运行的Elastic实例。因此,您可以省略任何EXPOSE-p的设置。但是要注意,根据他们的文档:

  

-network =“ host”赋予容器对本地系统服务(例如D-bus)的完全访问权限,因此被认为是不安全的。