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

War*_*ame 5 networking flask docker

我在容器内有一个烧瓶应用程序。我运行这个容器

docker run -p 5000:5000 pyprojects_web
Run Code Online (Sandbox Code Playgroud)

它回复

 * 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)
Run Code Online (Sandbox Code Playgroud)

如果我跑

docker container ls
Run Code Online (Sandbox Code Playgroud)

我得到

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
Run Code Online (Sandbox Code Playgroud)

如果我访问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
Run Code Online (Sandbox Code Playgroud)

http://localhost:5000给出了类似的响应。

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

from app import app


if __name__ == "__main__":
    app.run(host="0.0.0.0")
Run Code Online (Sandbox Code Playgroud)

如果我从容器内部卷曲,它可以完美运行:

docker exec -it 2221298e6e2c curl http://localhost:5000
Run Code Online (Sandbox Code Playgroud)

带有很长的 HTML 响应,我的服务器日志得到:

127.0.0.1 - - [04/Jun/2018 01:00:16] "GET / HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

鉴于这些结果,并考虑到我有一个“0.0.0.0”主机,还有什么可以尝试的?

谢谢。

joh*_*s85 6

因此,根据评论,很明显您实际上0.0.0.0并没有继续运行,这可能是(注意您command的容器),因为您正在运行更新版本的烧瓶,我认为您必须将一些参数传递给flask run.

尝试flask run --host=0.0.0.0作为容器中的命令,我认为这可能会解决您的期望:)

更多信息在Flask 文档

  • 我克隆了你的 repo,将最后一条指令更改为 `CMD ["flask", "run", "--host=0.0.0.0"]` 重建了图像,效果很好。 (2认同)