从Docker容器连接到运行的主机Elasticsearch实例

4

I have this simple setup: A 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"
}

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

1
你需要在 Dockerfile 中删除 EXPOSE 9200 指令,因为端口号9200已被elastic search服务占用。
你应该使用主机IP地址进行curl。 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

关于您的问题,更多信息请参见此帖子。


0

Elasticsearch使用端口9200。现在您想将容器中的端口9200发布到本地主机。您不能让两个应用程序同时监听本地主机的同一端口。


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),因此被认为是不安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接