要启动我的 Docker 容器,我使用:
docker run -p 5001:5001 -p 7777:7777 -i -t --entrypoint /bin/bash dc261bdea451
可以看到,我公开了两个端口:5001 和 7777
nodejs
运行在端口 5001 上,socko 服务器运行在 7777 上。从浏览器中,我可以通过 http://localhost:5001
和 http://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....
但这不是一个解决方案,因为它需要在部署后更新容器。
最佳答案
- 您不需要使用端口映射(
-p
标志)来允许容器内部通信。仅当您想要从主机连接到容器时才需要这样做。 - 一般来说,建议每个容器仅运行一个进程。您可能希望考虑在不同的容器中运行这两个进程,并通过 Docker 网络将它们链接起来。
无论如何,要调查该问题,请在容器中启动 bash,以验证端口 7777 上的服务是否可以从容器内访问( docker exec -it <container_id> bash
、 telnet localhost 7777
)。如果它没有监听,您需要检查它是否绑定(bind)到正确的主机名。
关于node.js - docker 容器内的应用程序无法调用同一容器上的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41522308/