【问题标题】:How to publish flask port from container to host [duplicate]如何将烧瓶端口从容器发布到主机[重复]
【发布时间】:2019-09-01 02:08:38
【问题描述】:

我想在本地运行一个 dockerized 烧瓶服务器并访问我在其中定义的任何路由。重现我的问题的设置:

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'

Dockerfile

from python:3.7-alpine

COPY app.py app.py

RUN pip install flask

CMD [ "flask", "run" ]

构建这个容器可以正常工作。在the documentationsome in-depth examples 之后,使用docker run -p 5000:5000 flask 运行它应该可以解决问题。它启动容器并且看起来不错:

* Environment: production   
  WARNING: Do not use the development server in a production environment.  
  Use a production WSGI server instead.  
* Debug mode: off  
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

docker ps 告诉我端口映射似乎也有效:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
0581bf3af0ea        flask               "flask run"         25 seconds ago      Up 24 seconds       0.0.0.0:5000->5000/tcp   nervous_brown

但是当我尝试在浏览器中访问该站点时,我只收到 404。

有趣的是,使用docker run --net=host flask 运行图像确实有效,但我宁愿不使用它。

我真的不擅长理解网络的工作原理,我做错了什么?

【问题讨论】:

    标签: python docker flask alpine


    【解决方案1】:

    将运行flask 的主机更改为'0.0.0.0'。容器中的 localhost 只对容器是本地的,而不是你的计算机:

    flask run -h 0.0.0.0
    

    这会将应用绑定到容器上的所有网络接口,并且您的机器可以访问

    为什么 LocalHost 无法访问?

    Docker 容器是它们自己的小型独立网络。他们有一个外部接口eth0,他们有一个外部IP地址,他们有路由表和一个本地主机。本地主机不映射到外部接口,尝试这样做通常是不好的做法。

    我们以一个简单的容器为例,我会像这样运行一个linux容器:

    docker run -it ubuntu bash
    

    现在我可以通过运行apt-get update && apt-get install net-tools 来查看该容器内的网络详细信息:

    ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
            RX packets 11286  bytes 16471897 (16.4 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3421  bytes 189224 (189.2 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    lo 是环回或本地主机。它是一个完全独立的界面,不是面向外部的,eth0 是。你可以绑定它,但我不能保证IP地址一直都是一样的。所以最简单的方法是将flask绑定到all

    Loopback 只是为了让网络与自己进行通信,仅此而已。它不需要有一个面向外部的组件,因为根据设计它不适合外部通信

    【讨论】:

    • 您介意解释一下为什么无法访问 localhost 吗?我的意思是,最后它只是另一个IP地址,对吗?还是 127.x.x.x 以下的所有东西都以某种方式被阻止到达外部?
    • 确定一秒
    • 是的,谢谢!
    猜你喜欢
    • 2013-07-20
    • 2019-01-05
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多