node.js - docker 容器内的应用程序无法调用同一容器上的服务

标签 node.js docker

要启动我的 Docker 容器,我使用:

docker run -p 5001:5001 -p 7777:7777 -i -t --entrypoint /bin/bash dc261bdea451

可以看到,我公开了两个端口:5001 和 7777

nodejs 运行在端口 5001 上,socko 服务器运行在 7777 上。从浏览器中,我可以通过 http://localhost:5001http://localhost:7777 直接访问这些服务。在端口 5001 上运行的 Nodejs 应用程序调用在端口 7777 上运行的服务:

因此,通过调用 http://localhost:5001 来调用 http://localhost:7777 :

var request = require('request');
request("http://localhost:7777?param=param....

问题是端口 7777 上运行的服务未被调用。我也尝试过:

var request = require('request');
request("http://127.0.0.1:7777?param=param....

但结果相同。

当我在 Docker 容器之外运行应用程序时,不会出现此问题。

我是否缺少一个配置选项,允许在一个 Docker 容器上运行的两台服务器进行通信?

更新:

将主机名更改为运行 docker 容器的计算机的 IP 地址可到达端点。所以改变这个是有效的:

var request = require('request');
request("http://localhost:7777?param=param....

var request = require('request');
request("http://my.ip.address:7777?param=param....

但这不是一个解决方案,因为它需要在部署后更新容器。

最佳答案

  1. 您不需要使用端口映射(-p 标志)来允许容器内部通信。仅当您想要从主机连接到容器时才需要这样做。
  2. 一般来说,建议每个容器仅运行一个进程。您可能希望考虑在不同的容器中运行这两个进程,并通过 Docker 网络将它们链接起来。

无论如何,要调查该问题,请在容器中启动 bash,以验证端口 7777 上的服务是否可以从容器内访问( docker exec -it <container_id> bashtelnet localhost 7777 )。如果它没有监听,您需要检查它是否绑定(bind)到正确的主机名。

关于node.js - docker 容器内的应用程序无法调用同一容器上的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41522308/

相关文章:

javascript - 使用 Underscore/Lodash 在 javascript 中执行非变异反尾的最佳方法

node.js - 无法将dockerized keystone 容器与dockerized mongo 容器连接

docker - 触发 docker-compose run 命令时是否可以重用现有的已停止容器?

ubuntu - Docker - 使用 IP 浏览 Docker 容器

docker - 如何检查 Docker 的重启策略是否有效

node.js - 使用 node.js 的 Paypal 结帐 - 模块?

javascript - 如何使用 Passport JS 管理某些使用 Express 的路线的 session ?

node.js - Node.js 中 RSS 内存增加而堆稳定

docker - 如何在docker-php api中的docker execstart中进行标准输入

javascript - future 有必要在 Node 中运行一系列异步函数吗?