我有这个简单的设置: 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实例的主机?
我所需要的只是能够从容器内执行
答案 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
答案 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)的完全访问权限,因此被认为是不安全的。