从docker容器连接到主机elasticsearch运行实例
我有一个简单的设置: Dockerfile:从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实例 在主机上执行此操作时,我得
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