gpt4 book ai didi

javascript - 当 Docker 使用端口时,Node.js 不会抛出 EADDRINUSE

转载 作者:行者123 更新时间:2023-11-30 20:50:12 24 4
gpt4 key购买 nike

我正在用 Node.js 编写一个 HTTP 服务器。我想确保在我要使用的端口已分配时出现错误(应该是 EADDRINUSE 错误)。所以我的代码看起来像这样:

const http = require('http');

http.createServer((req, res) => {
res.end('Hello world');
}).listen(3000, {
console.log('Server running.');
}).on('error', err => {
console.log(err);
});

现在,当我运行此服务器一次时,它可以正常工作,并且服务器在端口 3000 上运行。当我第二次运行该服务器时,它如预期的那样失败并出现错误。

到目前为止,还不错。

现在我启动一个使用端口 3000 的 Docker 容器(我正在为 macOS 17.12 使用 Docker)。当我现在运行我的 Node.js 应用程序时,我收到服务器正在运行的消息,但它没有响应 – 显然它没有运行?

如果我换行

}).listen(3000, {

}).listen(3000, '0.0.0.0', {

然后我实际上得到了错误信息。那么,Docker 的情况有何不同?为什么服务器能正常启动,然后就不能访问了? ……?

PS:我本来以为Docker可能会绑定(bind)IPv4,Node.js会绑定(bind)IPv6,但不管我是否访问http://localhost:3000 , http://127.0.0.1:3000 , 或 http://[::1]:3000 – 始终是 Docker 容器进行回复。

PPS:具体的 Docker 容器并不重要——我得到了 任何 使用端口 3000 的 Docker 容器的行为。如果你想重现它,你可以使用 docker run -d -p 3000:80 nginx.

最佳答案

因为您在容器中运行应用程序,docker 会为每个容器分配单独的虚拟网络接口(interface)。您实际上可以在图像中看到它们(docker run -it my_node_container/bin/bashifconfig)。因此,当您不指定 0.0.0.0 时,它会绑定(bind)到本地接口(interface),该接口(interface)不会暴露在容器外部。如果您确实绑定(bind)到 0.0.0.0,它现在会暴露在容器外部(或不暴露,取决于您的网络配置,您必须映射端口或运行 -net=host)。所以现在它可能会与监听同一端口的其他应用程序发生冲突。

关于javascript - 当 Docker 使用端口时,Node.js 不会抛出 EADDRINUSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com