【问题标题】:Application running in docker can't connect with elasticsearch docker在 docker 中运行的应用程序无法连接到 elasticsearch docker
【发布时间】:2020-04-12 12:22:03
【问题描述】:

我是 docker 新手,有一个连接到 elasticsearch 的简单 DW(dropwizard) 应用程序,该应用程序已经使用 docker-compose.yml 在 docker 中运行,它具有以下内容。

用于弹性搜索的 Docker-compose.yml

version: '2.2'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.0
    container_name: elasticsearch
    environment:
      - xpack.security.enabled=false
      - discovery.type=single-node
    ports:
      - 8200:9200
      - 8300:9300

volumes:
  elasticsearch-data:
    driver: local

注意:我将 8200 和 8300 作为主机(本地 mac 系统)上的 ES 端口公开

现在,当我在 localhost 上简单地运行连接到 8200 中的 ES 的 DW 应用程序时,一切正常,但现在我正在尝试对我的 DW 应用程序进行 docker 化并遇到一些问题。

下面是我的 DW 应用程序的 Dockerfile

COPY target/my.jar my.jar
COPY config.yml config.yml
ENTRYPOINT ["java" , "-jar" , "my.jar", "server", "config.yml"]

当我运行上面的 DW docker 映像时,它立即停止,使用 docker logs <my-container-id>,它抛出以下异常:

*java.io.IOException: elasticsearch: Name does not resolve*
    org.elasticsearch.client.IndicesClient.exists(IndicesClient.java:827)
**Caused by: java.net.UnknownHostException: elasticsearch: Name does not resolve**

我尝试过的事情

  1. 错误信息明确提到我的 DW 应用程序 docker 实例无法连接到 elasticsearch,我验证它运行正常。
  2. 还检查了 Elaticsearch docker 的网络,它的网络别名为elasticsearch,如下所示,n/w 为docker-files_default

    “别名”:[ “弹性搜索”, “de78c684ae60” ],

  3. 检查了我的 DW 应用程序 docker 实例的 n/w,它使用 bridge 网络并且没有任何网络别名。

现在,我怎样才能让我的应用程序 docker 和 elasticsearch docker 使用相同的网络,以便它们可以相互连接,我想这会解决问题?

【问题讨论】:

  • EXPOSE 仅用于文档目的,它不发布任何内容。您应该在运行容器时将它们连接到公共网络,然后容器名称是您可用于容器间通信的 DNS 名称。 (或者只是将它们放在一个 compose 文件中,然后会自动为您的容器创建一个默认网络)。
  • @michalk 感谢您的超快速响应,还有其他方法可以将容器端口发布/绑定到主机端口吗?同样对于第二部分,我不太确定我是否要这样做,因为我想将它们解耦
  • @michalk,你有机会看看我的评论吗?

标签: java amazon-web-services docker docker-compose docker-network


【解决方案1】:

解决此问题的两种方法:首先是检查 docker-compose 为您的 elasticsearch 设置创建的网络 (docker network ls),然后运行您的 DW 应用程序

docker run --network=<name of network> ...

第二种方法是创建一个网络 docker network create elastic 并将其用作 docker compose 文件以及 DW 应用程序的 docker run 命令中的外部网络。

Docker compose 文件可能看起来像

...
services:
  elasticsearch:
     networks:
       elastic:
...
networks:
    elastic:
        external: true

【讨论】:

  • 嘿,我已经提到了elastic docker的网络名称以及我使用相同命令获得的DW应用程序,我也使用了您的选项1,但它不起作用
  • 第二个选项,在创建 docker create network elastic 时得到 Error response from daemon: pull access denied for network, repository does not exist or may require 'docker login': denied: requested access to the resource is denied,而其他 docker 命令和 pull 工作正常
  • 对不起,我把参数写错了,应该是docker network create elastic。对于另一种方式,您将使用docker run --network=docker-files_default ...,因此两个容器共享同一个网络
  • 尝试了第一个选项但仍然无法使其工作,没有尝试第二个选项,因为它似乎更有效,同样在第一个选项的情况下,确认应用程序和 ES docker 都使用@987654329 @ n/w 现在错误消息不同,它抛出 java.net.ConnectException: Connection refused 而不是初始 *java.io.IOException: elasticsearch: Name does not resolve*
  • 到目前为止听起来不错。使用容器网络时,使用内部端口,而不是映射端口。所以对于弹性:9200
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2019-05-24
  • 2016-12-04
相关资源
最近更新 更多