我有一个 java spring boot 应用程序。 该应用程序使用 cassandra 作为数据存储,使用 kafka 进行消息传递。 我正在本地使用 cassandra、zookeeper 和 kafka 的镜像来运行它们。
我还为我的 Web 应用程序创建了 DockerFile,并构建该文件来创建图像。
我的应用程序运行时连接到 cassandra 数据库。
当我运行应用程序(intelij)时,它通过连接到cassandra(作为docker运行)可以正常工作,但是当我在本地为同一应用程序运行docker镜像时,应用程序镜像容器无法连接到本地运行的cassandra并且因此失败了。
我需要做什么才能运行应用程序的 docker 容器并连接到 cassandra。
最佳答案
我不知道您在应用程序中使用的连接详细信息(主机:端口)的具体细节,但在这种情况下最常见的错误是使用 localhost
。
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"
在此示例中,每个服务的主机名是 web 和 redis。您可以将其应用到您的撰写文件中,并为 cassandra 和 kafka 使用相应的主机名。
关于java - 如何为使用 kafka 和 cassandra 的应用程序设置/创建 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61583415/