【发布时间】:2021-10-25 18:06:07
【问题描述】:
我有一个 nodeJS-app dockerized。在此,我使用 Redis 连接。 Redis 在 localhost 127.0.0.1:6379 上运行。 它没有作为 docker 容器运行!
在我的 nodejs 文件中,我有以下内容:
client = redis.createClient({
host: '127.0.0.1',
port: 6379
});
当我运行node index 时,连接正常。但是当我构建 docker 镜像并运行容器时,nodeJS 应用无法连接到 redis 服务器(ECONNREFUSED)。
我也在 GCP 上使用托管 redis 服务器对其进行了测试,它也无法连接。
编辑:
我现在可以使用 nodeJS 中的以下代码连接到 localhost redis 客户端:
client = redis.createClient({
host: 'host.docker.internal',
port: 6379
});
但我仍然无法连接到外部 IP 地址,如下所示:
client = redis.createClient({
host: EXTERNAL_IP_HERE,
port: 6379
});
【问题讨论】:
-
在容器内部,
127.0.0.1(或localhost)指的是容器本身,而不是主机。您没有将 Redis 服务器作为容器运行的任何原因? Docker 网络非常有用。 -
是的,但我计划在 GCP 中的虚拟机上部署 docker 容器,并且我想在 GCP 中使用托管的 redis 服务器。
-
您可以使用 dockerized Redis 服务器进行本地开发,这很常见。 GCP 是否提供公共 IP 地址,例如,您可以从您的计算机上
ping吗?我从未使用过它,但我猜它可能是专用网络的 IP。 -
是的,我可以 ping 通它。当我使用带有外部 ip 的代码并运行
node index时,它可以工作。但在 docker 容器中,我收到“连接 ETIMEDOUT”错误。 -
对不起,我找到了解决办法。我试图通过我的本地设置连接到 redis 服务器的 INTERAL ip。仅当您将代码上传到谷歌云虚拟机时,内部 IP 才有效。我的错。无论如何,谢谢你的cmets。祝你有美好的一天!