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

从docker容器连接到主机elasticsearch运行实例,docker,dockerfile,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实例 在主机上执行此操作时,我得

我有一个简单的设置: 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实例

在主机上执行此操作时,我得到了正确的响应:

  {
  "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

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

您应该使用主机的ip地址
curl
。 Docker首先将容器连接到
网桥
网络,因此您需要一种获取主机ip地址的方法

您可能需要设置别名,具体取决于您的主机是否连接到更宽的网络。我为我的
bridge0
接口设置了这个别名

sudo ifconfig bridge0 alias <ip_address>
您可以通过任何一种方式将网络接口的
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

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

这里有一个快速破解方法,可以让它正常工作。在主机上使用
curl-X GET'http://0.0.0.0:9200“
,我认为,
docker run--net host--name your_app
将允许容器应用程序查询主机上运行的弹性实例。因此,您可以省略任何
暴露
-p
设置。但要注意,根据他们的文件:

--network=“host”使容器能够完全访问本地系统服务,如D-bus,因此被认为是不安全的

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