我創建了一個簡單的 Flask 應用程式,使用 Docker 對其進行容器化,并將容器推送到我的 EC2 實體(使用 gzip 和 sftp)。我已經啟動了影像并確認它正在使用docker ps:

燒瓶應用程式預計將在埠 8080 上訪問:
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
我已經在我的Dockerfile:
FROM python:3.10-slim
ENV PYTHONUNBUFFERED True
...
EXPOSE 8080
CMD exec gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 main:app
在確認 Dockerized Flask 應用程式正在我的 EC2 實體上運行后,我嘗試使用實體公共 IPv4 DNS 地址和埠號通過我的 Web 瀏覽器訪問它:
ec2-digits.region.compute.amazonaws.com:8080
并收到一個錯誤:ERR_CONNECTION_REFUSED
我立即在入站流量上添加了一個新的安全規則,允許任何 IPv4 流量進入埠 8080:

盡管如此,在重新啟動實體后,我在嘗試聯系我的 Flask 應用程式時仍然看到相同的錯誤。
我已通過以下方式驗證了 Flask 已安裝(v2.2.2)pip3 list
docker container logs my_app在嘗試在埠 8080 上連接之前和之后不顯示任何錯誤:
[2022-10-25 22:54:37 0000] [1] [INFO] Starting gunicorn 20.1.0
[2022-10-25 22:54:37 0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2022-10-25 22:54:37 0000] [1] [INFO] Using worker: gthread
[2022-10-25 22:54:37 0000] [7] [INFO] Booting worker with pid: 7
我錯過了什么?
uj5u.com熱心網友回復:
我立即在入站流量上添加了一個新的安全規則,允許任何 IPv4 流量進入埠 8080:
安全組永遠不會導致 CONNECTION REFUSED。安全組默默地丟棄流量,因此它們會導致超時,而不是連接被拒絕。
順便說一句,除非您的應用程式真的準備好面對世界,否則您可能不想向所有流量開放您的安全組。人們可以并且將會找到開放的埠并嘗試濫用您的應用程式。所以最好將您當前的 IP 用于安全組規則,即使您必須在 IP 更改時進行更新。
盡管如此,在重新啟動實體后,我仍然看到相同的錯誤
重啟您的實體與安全組無關。
你在運行docker容器的時候暴露8080了嗎?運行生成的映像時,Dockerfile 中的 EXPOSE 實際上不會打開任何埠。
docker run .... -p 8080:8080 ....
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519766.html
