【问题标题】:How to set/create docker images for application that uses kafka and cassandra如何为使用 kafka 和 cassandra 的应用程序设置/创建 docker 映像
【发布时间】:2020-05-04 00:30:38
【问题描述】:

我有一个 java spring boot 应用程序。 该应用程序使用 cassandra 作为数据存储,使用 kafka 进行消息传递。 我在本地使用 cassandra 和 zookeeper 和 kafka 的图像来运行它们。

我还为我的 Web 应用程序创建了 DockerFile,并构建文件以创建映像。

我的应用程序运行时,连接到 cassandra 数据库。

当我运行应用程序(intelij)时,它通过连接到 cassandra(作为 docker 运行)可以正常工作,但是当我在本地为同一个应用程序运行 docker 映像时,应用程序映像容器无法连接到本地运行的 cassandra 并且因此失败了。

我需要做什么才能运行应用程序的 docker 容器并连接到 cassandra。

【问题讨论】:

  • 如何在应用程序中指定与 Cassandra 的连接详细信息?意味着您使用的是哪个主机:端口组合?我问这个是因为如果你使用 localhost 这将不起作用,因为 docker 容器内的 localhost 与你的机器不是同一个 localhost。
  • @Slacky 我明白了。是的,我正在使用本地主机。作为镜像运行时如何为 cassandra 指定端口?
  • 我添加了解释作为答案,因为我预计 localhost 会是这里的问题。端口应该是 cassandra 使用的端口。这里的问题是主机名而不是端口。 cassandra 容器将响应与以前相同的端口,并且可以由另一个容器到达。

标签: java docker cassandra dockerfile


【解决方案1】:

我不知道您在应用程序中使用的连接详细信息(主机:端口)的具体细节,但在这种情况下最常见的错误是使用 localhost

当您在 docker 容器外启动应用程序时,docker 容器中的localhost 与 localhost 不同。因此,在 docker 容器内启动应用程序时,您必须为 cassandra 部署指定不同的主机名。

默认情况下,docker 将使用容器 ID 作为容器主机名,因此您必须将 localhost 替换为您的 cassandra 容器 ID,或者使用 --hostname 启动 cassandra 容器,以便定义您希望使用的主机名.

最后一个更优雅的解决方案是使用 docker compose 文件,其中每个服务的主机名是服务名。这对于启动多个相互“对话”的服务非常有帮助。

您可以找到我向您解释的有关容器主机名here 的所有内容。

另外here 你可以找到一个不错的 docker compose 介绍。

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

在此示例中,每个服务的主机名是 webredis。您可以将其应用于您的撰写文件,并为 cassandra 和 kafka 使用相应的主机名。

【讨论】:

  • 是的,我有一个 docker compose 文件,用于设置 kafka、cassandra 等。那么你建议我在我的 dockerfile 中有一个命令来运行 docker-compose up 命令,还是建议我使用 docker compose 文件中指定的 cassandra 服务的名称来引用 cassandra 主机?
  • 那么我看到的唯一问题是主机名。只需在应用程序中使用 cassandra 服务的名称而不是 localhost。
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多