gpt4 book ai didi

node.js - 我的 express https 服务器在本地工作但不在 docker 容器中

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:25 26 4
gpt4 key购买 nike

我目前有两个 docker 容器在运行:

ab1ae510f069        471b8de074c4        "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:3001->3001/tcp                     hopeful_bassi
2d4797b77fbf 5985005576a6 "nginx -g 'daemon of…" 25 minutes ago Up 25 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp wizardly_cori

一个是我的客户端,另一个(端口 3001)是我的服务器。

我面临的问题是我刚刚将 SSL 添加到我的网站,但现在我无法访问服务器。我的理论是服务器需要同时打开端口 443 和端口 3001,但我不能在两个容器上都打开 port 443。我可以在本地通过 HTTP 运行服务器,所以我认为这也指向了这个结论。

我能做些什么来同时使用 https 吗?如果服务器使用 http(原因很明显),客户端将不会与服务器通信。

编辑:我现在不确定它是否与端口 443 有关,因为我杀死了我的客户端并试图只运行服务器,但它仍然给我连接拒绝:

docker run -dit --restart unless-stopped -p 3001:3001 -p 443:443 471b8de074c4

最佳答案

如果你为一个docker容器打开443端口,这意味着一个docker管理的工具将被启动。这个(无论如何,高度支持最佳)工具会将 TCP 请求转发到您的主机端口 443 到容器。

如果你想让两个容器使用端口 443,docker 会想在同一个端口上启动这个 portforwarder 两次。正如您的 docker 输出所示,它只能发生一次。也许(深入)挖掘(几乎不存在的)docker 日志,您还可以看到相关的错误消息。

您发现的问题与 docker 无关,这与您在无容器环境中面临的问题相同 - 您根本无法启动多个服务进程来监听同一个 TCP 端口。

此外,解决方案来自容器之前的世界。

您需要一个中央代理服务,它会监听您的端口 443,并将请求(取决于请求的虚拟主机)转发到相应的容器

深入研究 docker 容器,几乎可以肯定存在这样的 https 转发代理。第三个容器会将请求转发到您想要的位置。当然,您需要对其进行配置。

从那一刻起,您甚至不需要在您的容器中安装 https(尽管您可以根据需要安装),这对高效、正确认证的 ssl 环境有很大帮助。只有您的代理需要证书。所以:

                 /---> container A (tcp:80)
tcp:443 -- proxy
\---> container B (tcp:80)

关于node.js - 我的 express https 服务器在本地工作但不在 docker 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57741363/

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