从docker容器连接到主机elasticsearch运行实例
我有这个简单的设置: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" }
但是,如果我build立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
您需要删除EXPOSE 9200
中的EXPOSE 9200
指令,因为弹性search服务已经使用端口号9200。
你应该curl
你的主机的IP地址。 Docker将容器连接到bridge
networking,以便您开始获取主机的IP地址。
您可能需要根据主机是否连接到更广泛的networking来设置别名。 我为我的bridge0
接口设置了这个别名。
sudo ifconfig bridge0 alias <ip_address>
如果您的主机连接到更广泛的networking,请使用分配给您的以太网设备的inet
地址。 您可以运行以下命令获取inet
地址:
ifconfig en0 | grep "inet " | cut -d " " -f2
您可以将networking接口的inet
地址作为环境variables传递给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
看到这个线程获取更多关于你的问题的信息
弹性search使用端口9200.现在,您想要将端口9200从容器发布到本地主机。 您不能让两个应用程序在本地主机的相同端口上侦听。