Docker应用程序无法通过打开的端口访问。

8

我有一个 Flask 应用程序,它在一个容器中。我使用以下命令运行此容器:

docker run -p 5000:5000 pyprojects_web

它回复了。
 * Serving Flask app "debateit.py"
 * 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 container ls

I get

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
2221298e6e2c        pyprojects_web      "flask run"         12 minutes ago      Up 12 minutes       0.0.0.0:5000->5000/tcp   elated_joliot

如果我访问http://127.0.0.1:5000,我会得到以下结果:
This site can’t be reached
The web page at http://127.0.0.1:5000/ might be temporarily down or it may have moved permanently to a new web address.
ERR_SOCKET_NOT_CONNECTED

http://localhost:5000 提供了类似的响应。

通常建议使用 0.0.0.0 在容器内监听所有连接,但我已经这样做了。这是我的应用程序:

from app import app


if __name__ == "__main__":
    app.run(host="0.0.0.0")

如果我在容器内部使用curl,则完美运行:

docker exec -it 2221298e6e2c curl http://localhost:5000

当HTML响应很长时,我的服务器日志会收到:

127.0.0.1 - - [04/Jun/2018 01:00:16] "GET / HTTP/1.1" 200 -

鉴于这些结果,以及我拥有一个"0.0.0.0"主机,还有什么可以尝试的吗?谢谢。

你使用的是哪个操作系统?顺便说一下,这不是 Flask 的问题,你的 Flask 设置看起来很好。 - user3483203
以下命令输出的含义是什么:docker run -it --rm --net container:2221298e6e2c nicolaka/netshoot netstat -lnt - BMitch
1
你可能需要尝试访问 192.168.99.100:5000192.168.64.8:5000,具体取决于使用的操作系统。 - user3483203
@chrisz 这是在Ubuntu上的问题,但我在Windows上使用Docker for Windows时也遇到了类似的问题。我的代码不是完整的Flask应用程序,但可以展示我正在使用0.0.0.0。如果需要,我可以链接我的Github存储库。这两个IP地址都对我无效。 - WarSame
1
而运行@BMitch要求您运行的命令的输出证实了这一点 :) - johnharris85
显示剩余2条评论
2个回答

8
根据评论,很明显你没有在0.0.0.0上运行,这可能是因为你正在运行较新版本的Flask,在那里我认为你必须传递一些参数给flask run。请尝试在容器中使用命令flask run --host=0.0.0.0,我认为这将按照你的期望工作 :) 更多信息请参见Flask Docs

听起来你说得对。然而,我进行的初步测试并没有证明这一点。你能否提供更具体的细节?如果我的Dockerfile中有一行"CMD ["flask", "run", "--host=0.0.0.0"]",那么应该可以实现你所说的功能,对吗?但是这对我不起作用。Github仓库地址为:https://github.com/WarSame/DebateItPy/tree/flask - WarSame
2
我克隆了你的代码库,将最后一条指令改为CMD ["flask", "run", "--host=0.0.0.0"],重新构建了镜像,现在一切都运行得很好。 - johnharris85
那绝对有效。非常感谢!现在运行时会显示“正在运行 http://0.0.0.0:5000/ (按CTRL+C退出)”,并且访问localhost:5000会给我所需的HTML,这是期望的行为! - WarSame

0
针对 Django 项目:
docker exec -it mycontainer bash python manage.py runserver 0.0.0.0:8000
而不是 python manage.py runserver

如果您有新的问题,请通过点击提问按钮进行提问。如果链接能提供上下文,请包含此问题的链接。- 来自审核 - PavanDevarakonda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接