我的Express https服务器在本地工作,但不在Docker容器中工作

时间:2019-08-31 20:22:05

标签: node.js linux docker express

我目前有两个正在运行的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

1 个答案:

答案 0 :(得分:0)

如果打开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)