【问题标题】:Why can't I connect to the flask server in docker container?为什么我无法连接到 docker 容器中的烧瓶服务器?
【发布时间】:2020-03-24 08:07:52
【问题描述】:

我的虚拟机操作系统是 CentOS 7,它的 docker 版本是 19.03.8。我创建了自己的图像python-image。我运行以下代码来创建一个新容器:

docker run -it -p 5555:5000 python-image /bin/bash

在容器中,一个名为test.py的python脚本如下:

# test.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def func():
    return "Hello docker!"


if __name__ == '__main__':
    app.run('0.0.0.0', port=5000)

然后我运行 python test.py 并向上运行容器。

在主机 shell 中,我运行 curl http://127.0.0.1:5555/ 并打印:

curl: (56) Recv failure: Connection reset by peer

我知道如果在创建容器时将--network指定为host

docker run -it --network host python-image /bin/bash

启动服务器并在主机中运行curl http://127.0.0.1:5555/ 将获得预期的信息。我想知道当保持默认值--network 时我应该怎么做才能得到相同的结果。

【问题讨论】:

  • 这看起来基本正确,除了您的 docker run 命令正在启动 bash shell 而不是您的服务器应用程序。但是-p 选项、app.run() 调用和端口规范似乎都是正确的。
  • ...容器是在虚拟机内运行,而浏览器是在主机上的虚拟机外运行吗?您需要在已发布的端口上连接到 VM 的 IP 地址。
  • @DavidMaze 浏览器位于虚拟机内部。

标签: python docker flask containers


【解决方案1】:

如果没有指定,Docker 使用的默认网络是Bridge network。要访问容器,您应该使用它自己的 IP 地址。可以find the container's IP address 使用:

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

然后将其替换为127.0.0.1

或者您可以将其保存在变量中并尝试:

$ container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id)
$ curl http://${container_ip}:5555

【讨论】:

  • 此 IP 地址不适用于各种常见环境(来自 MacOS 或 Windows 主机,如果浏览器不在同一物理主机上,如果容器在 VM 内运行) .通常没有理由查找容器专用 IP 地址。您通常应该使用docker run -p 发布的端口来连接它,如问题所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2021-08-21
  • 1970-01-01
  • 2019-07-13
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多