docker容器中的应用程序不能在同一个容器上调用服务
要启动我的docker集装箱,我使用:
docker run -p 5001:5001 -p 7777:7777 -i -t --entrypoint /bin/bash dc261bdea451
可以看到我正在暴露两个端口:5001和7777
nodejs
运行在nodejs
上的端口5001&socko服务器上。通过浏览器,我可以通过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容器之外运行应用程序时,不会发生此问题。
有没有一个configuration选项,我错过了允许两个服务器上运行一个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....
但这不是一个解决scheme,因为它需要在部署后更新容器。
- 您不需要使用端口映射(
-p
标志)来允许容器内部通信。 只有当你想从你的主机连接到容器时才需要。 - 通常build议每个容器只运行一个进程。 您可能希望查看在不同容器中运行这两个进程,并通过Dockernetworking连接它们。
无论如何,要调查问题启动容器中的bashvalidation端口7777上的服务可以从容器内( docker exec -it <container_id> bash
, telnet localhost 7777
)到达。 如果它不在监听,你需要检查它是否绑定到正确的主机名。