![](/img/trans.png)
[英]My node.js webapp (with bootsrap) works locally but not on my express server
[英]My express https server works locally but not in a docker container
我目前有兩個正在運行的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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.