当 运行 Streamlit 在我的机器上使用 dockerFile 启动它时,无法向 127.0.0.1:8000 发出请求

Not able to do a request to 127.0.0.1:8000 when running Streamlit on my machine launching it with a dockerFile

我有一个 streamlit 应用程序 (localhost:8501) 和一个 API (127.0.0.1:8000)

我的 streamlit 应用程序试图访问 API。

当我启动启动“streamlit”的命令时效果很好。但是当 streamlit 在 Docker 容器中时,我无法访问 URL。我有这个错误:

ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: /predict (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f2a5ebae090>: Failed to establish a new connection: [Errno 111] Connection refused'))

这是我的 dockerfile:

FROM tiangolo/uvicorn-gunicorn:python3.7

ENV PYTHONPATH .

RUN mkdir /streamlit

COPY requirements.txt /streamlit

WORKDIR /streamlit

RUN pip install -r requirements.txt

COPY . /streamlit

EXPOSE 8501

CMD ["streamlit", "run", "web/source/web_api.py"]

以及我启动的命令:

docker build --tag web_streamlit.
docker run --publish 8501:8501 --detach --name web_streamlit_container web_streamlit

如果您尝试从容器中 ping 本地主机,容器将自行 ping :)
如果您想从容器中访问主机本身 运行ning 的服务,您需要获取 docker0 接口的 IP:

在您的主机上:运行 ip addr show docker0 找到它

neo@neo-desktop:~$ ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:33:70:c8:74 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:33ff:fe70:c874/64 scope link 
       valid_lft forever preferred_lft forever

获取 IP(在我的示例中为 172.17.0.1)并使用 172.17.0.1:8000 从大陆到达您的 API。
PS:适用于 Linux。如果您 运行 Docker 在 Win 或 Mac 上,您需要做一些其他事情。

I'm able to access localhost:8501. Inside I have a streamlit application that is unable to reach localhos:8000 which is another service.

要访问 运行 上的服务,您有 mac 和 window 的特殊 DNS。

host.docker.internal,解析为主机使用的 i 内部 IP 地址

所以用host.docker.internal:8000

替换localhost:8000

special DNS for mac and window

或者如果您 Linux 然后设置 host 为您自己解析特殊的 DNS。

docker run --publish 8501:8501 -it --rm --add-host="host.docker.internal:192.168.9.100" --name web_streamlit_container  web_streamlit

其中 192.168.9.100 是您可以在 linux 中使用 ifconfig 获得的主机 IP。

因此您拥有 适用于所有平台 Linux、window 和 mac 的灵​​活 DNS,您无需修改​​代码。

问题的技术概述和快速修复 ☑️

__

假设您有 2 docker 张图片

第一张图片: Fastapi 或使用 Docker.

包装的任何其他 API 后端

第二张图片: 使用 Docker

包装的 Streamlit 前端

现在,当您从 streamlit docker 请求 API 到另一个 docker 例如 (localhost://predict) 时,它不会工作。

因为你被要求 API 当前本地主机到相同的 docker 本地主机并且它指向它自己。

因此,您需要将 streamlit 脚本中存在的本地主机更改为所需的 API 主机(意味着另一个 docker IP)

要找到该 IP,请点击以下命令:-

ip addr show docker0 

它会给你类似 172.17.0.1/16 的 IP 地址。

现在您已将您的 streamlit localhost 请求 url 更改为 ,

http://172.17.0.1/

然后再次构建 streamlit docker。

docker build -t frontend: version-1

现在运行 docker

docker run --rm -it -p 8501/8501/tcp frontend:version-1

完成 ✅