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