2017-07-19 65 views
1

我有這個簡單的設置: 一個Dockerfile:連接到主機elasticsearch乳寧實例

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 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 instan的主機CE?

所有我需要的是能夠從容器

捲曲http://localhost:9200/index_name/_search

回答

0

彈性搜索應用端口9200.現在您想要將端口9200從容器發佈到本地主機。您不能讓兩個應用程序在本地主機的同一端口上進行偵聽。

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