簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM