【问题标题】:docker elasticsearch container not forwarding port (macOs)docker elasticsearch容器不转发端口(macOs)
【发布时间】:2014-10-08 09:26:16
【问题描述】:

我设置了一个容器来运行 elasticsearch。服务启动,但我无法通过 curl 或浏览器连接到它。

 RUN \
 cd /tmp && \
 wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-  1.3.2.tar.gz && \
 tar xvzf elasticsearch-1.3.2.tar.gz && \
 rm -f elasticsearch-1.3.2.tar.gz && \
 mv /tmp/elasticsearch-1.3.2 /elasticsearch

 # Define mountable directories.
 VOLUME ["/data"]

 # Define default command.
  CMD ["/elasticsearch/bin/elasticsearch"]

 EXPOSE 9200
 EXPOSE 9300

连接到http://localhost:9200 不会产生任何结果。 docker ps 显示端口;

 0.0.0.0:49179->9200/tcp, 0.0.0.0:49180->9300/tcp
 ...
 net::ERR_ADDRESS_UNREACHABLE

我是否缺少一些配置值?谢谢!

[更新] 我也试过运行命令中的-p

 docker run -i -p 9200:9200 -p 9300:9300 -t --rm -P team1/image1

【问题讨论】:

  • Elasticsearch 默认只监听本地主机。我的猜测是 Docker 端口映射需要 ES 监听 docker 镜像中的非 localhost 接口。
  • 我遇到了同样的问题,@Guam Wang 在下面回答了这个问题。如果您不介意,您能否指定您在其中运行它的操作系统作为问题的一部分?这是我问题的根源。

标签: elasticsearch docker


【解决方案1】:

如果您在 OSX 上运行 docker,请注意主机实际上是您初始化 boot2docker 时安装的 VirtualBox 实例。所以在这种情况下,不要使用:

curl http://localhost:9200

找到使用的虚拟盒子实例的IP,我将其表示为VM_IP:

boot2docker ip

然后试试:

curl http://<VM_IP>:9200

【讨论】:

  • 砰,我从来没有想过将原始操作系统指定为问题的一部分。这也解决了我的问题。
  • 也可以直接做:curl $(boot2docker ip):9200
  • 如果你使用“Docker for Mac”,这就不是真的了
【解决方案2】:

在 docker 容器中运行 Elasticsearch 时,我遇到了端口转发问题。我通过手动指定绑定 Elasticsearch 服务器docker run --rm -p 9200:9200 -p 9300:9300 --name=es elasticsearch:latest -Des.network.host=0.0.0.0 的接口解决了这个问题。

绑定部分是末尾的-Des.network.host=0.0.0.0。我在https://mad.is/2016/09/running-elasticsearch-in-docker-container/写了一篇博文详细说明了这一点

【讨论】:

  • 绑定0.0.0.0 对我有用。您可以在 docker-compse.yml 中将其指定为这样的环境变量; SERVER_HOST: "0.0.0.0"
【解决方案3】:

我测试了您的 Dockerfile,但它可以正常工作。

FROM dockerfile/java
RUN \
  cd /tmp && \
  wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.tar.gz && \
  tar xvzf elasticsearch-1.3.2.tar.gz && \
  rm -f elasticsearch-1.3.2.tar.gz && \
  mv /tmp/elasticsearch-1.3.2 /elasticsearch
# Define mountable directories.                                                                                    
VOLUME ["/data"]
# Define default command.                                                                                          
CMD ["/elasticsearch/bin/elasticsearch"]
EXPOSE 9200
EXPOSE 9300

我尝试构建这个 Dockerfile 并运行它。

$ docker build -t 25312935 .
$ docker run -t -p 9200:9200 -p 9300:9300 --rm 25312935
[2014-08-15 04:41:08,349][INFO ][node                     ] [Black Crow] version[1.3.2], pid[1], build[dee175d/2014-08-13T14:29:30Z]
[2014-08-15 04:41:08,349][INFO ][node                     ] [Black Crow] initializing ...
[2014-08-15 04:41:08,353][INFO ][plugins                  ] [Black Crow] loaded [], sites []
[2014-08-15 04:41:10,444][INFO ][node                     ] [Black Crow] initialized
[2014-08-15 04:41:10,444][INFO ][node                     ] [Black Crow] starting ...
[2014-08-15 04:41:10,547][INFO ][transport                ] [Black Crow] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/172.17.0.72:9300]}
[2014-08-15 04:41:10,560][INFO ][discovery                ] [Black Crow] elasticsearch/0mpczYoYSZCiAmbkxcsfpg
[2014-08-15 04:41:13,601][INFO ][cluster.service          ] [Black Crow] new_master [Black Crow][0mpczYoYSZCiAmbkxcsfpg][eeb3396b1ecc][inet[/172.17.0.72:9300]], reason: zen-disco-join (elected_as_master)
[2014-08-15 04:41:13,615][INFO ][http                     ] [Black Crow] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/172.17.0.72:9200]}
[2014-08-15 04:41:13,615][INFO ][node                     ] [Black Crow] started
[2014-08-15 04:41:13,634][INFO ][gateway                  ] [Black Crow] recovered [0] indices into cluster_state

如下所示,请求127.0.0.1:9200返回json响应。

$ curl 127.0.0.1:9200
{
  "status" : 200,
  "name" : "Black Crow",
  "version" : {
"number" : "1.3.2",
  },
  "tagline" : "You Know, for Search"
}

检查您的-p 选项。这意味着将容器的端口发布到主机。如果你没有明确写主机的端口,docker 分配随机端口,如下所示。

$ docker run -t -p 9200 -p 9300 --rm 25312935
$ docker ps -l
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                                              NAMES
1aa4c2c84d04        25312935:latest      /elasticsearch/bin/e   15 seconds ago      Up 15 seconds       0.0.0.0:49153->9200/tcp, 0.0.0.0:49154->9300/tcp   sad_shockley

0.0.0.0:49153->9200/tcp表示可以通过宿主机的49153端口访问容器的9200端口。

$ curl 127.0.0.1:49153
{
  "status" : 200,
  "name" : "Golem",
  "version" : {
"number" : "1.3.2",
  },
  "tagline" : "You Know, for Search"
}

所以如果你想使用 hosts 9200 port, explicitly write the host port like-p 9200:9200or-p 0.0.0.0:9200:9200`

$ docker ps -l
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                                            NAMES
eeb3396b1ecc        25312935:latest      /elasticsearch/bin/e   59 seconds ago      Up 58 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   high_elion

如果这仍然不起作用,请尝试--net=host 选项。您可以通过此选项使用容器内的主机网络堆栈。

$ docker run -t --net=host --rm 25312935
$ curl 127.0.0.1:9200
{
  "status" : 200,
  "name" : "Black Crow",
  "version" : {
"number" : "1.3.2",
  },
  "tagline" : "You Know, for Search"
}

如果两者都不起作用,我认为您需要检查您的其他网络配置。

【讨论】:

  • 呃! “卷曲:(7)无法连接到 0.0.0.0:49200;连接被拒绝”谢谢@nacyot!看起来你是对的,这是其他一些网络配置问题 --net=host 也不起作用。
  • 顺便说一句,您使用的是什么操作系统?我在 2 OS X 上尝试过但失败了,但它可以在 ubuntu 机器上运行
  • 看起来像 OSX 中的 docker 错误...我没有看到端口打开 netstat -an | grep '听'
【解决方案4】:

使用 Docker for Mac 的人可以使用 docker.for.mac.localhost 作为 Elasticsearch 的主机。

curl http://docker.for.mac.localhost:9200

我有类似的问题,更改主机对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2017-01-03
    • 2013-07-20
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多