docker - 如何为在 Docker 容器中运行的 Flask 应用程序分配 IP
问题描述
我有一个简单的 Flask 应用程序,它只输出“Hello world”。flask run --host=127.0.0.23 --port=5001
如果我在我的主机上做类似的事情,我可以在给定的主机名和端口上在我的浏览器上 ping 应用程序。
但是,如果我在 Docker 容器中运行这个应用程序时做同样的事情,即我
CMD flask run --host=127.0.0.23 --port=5001
在我的 Dockerfile 中,我无法在我的主机浏览器上 ping 应用程序。
我知道app.run(host='0.0.0.0')
在 Flask 应用程序中可以在localhost:5000
我的主机上访问它。但我想知道我是否可以使用我自己分配的主机名访问该应用程序。
Flask 应用程序代码:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World"
if __name__ == "__main__":
app.run(host="0.0.0.0")
解决方案
您不会为您的应用程序“分配 ip”。您在主机上发布端口。也就是说,如果您的应用程序侦听5000
容器内的端口,您可能会运行:
docker run -p 5000:5000 myimage ...
这将在您的主机端口5000
上公开服务,这意味着在您的主机上运行的浏览器可以在localhost:5000
or访问该服务<any_address_of_your_host>:5000
,并且您网络上其他地方的浏览器也可以访问该服务<any_routeable_address_of_your_host>:5000
。
您的应用程序正在侦听的端口与您发布它的端口之间不需要任何关联。例如,对于上述情况,您可以改为运行:
docker run -p 80:5000 myimage ...
这会将您的应用程序暴露在主机上的端口 80 上。
阅读容器网络文档以获取更多信息。
推荐阅读
- datagrid - 是否可以在 Jboss 数据网格中使用像复杂查询这样的存储过程?
- cocos2d-x - Cocos2d-x 场景移动和不正确的物理调试绘制
- python - 如何在 Django view.py 中获得如下结构的 Html-Ajax 后数组值?
- excel - VBA中最大可能的十进制值是多少?
- docusignapi - 当我们发送信封进行签名时,如何停止向 Carbon Copy 收件人发送通知?
- python - 如何通过重复一行来连接两个 DataFrame?
- docker - 为什么 docker 在守护进程模式 (-d) 下运行获得权限被拒绝 (selinux) 而不是在交互模式下 (-ti)
- javascript - 如何在 Javascript 中为浏览器设计“终端”或 CLI 应用程序?(模拟阻塞 I/O)
- html - 视频文件在 Internet Explorer11 中 3 秒后停止播放
- selenium - Appium-inspector[android] 无法加载应用内的某些页面