2

我有一个流线型应用程序(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'))

这是我的码头文件:

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
4

3 回答 3

2

我能够访问localhost:8501. 在里面我有一个流线型应用程序,它无法访问localhos:8000另一个服务。

要访问正在运行的服务,您需要为 mac 和 window 提供特殊的 DNS。

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

所以替换localhost:8000host.docker.internal:8000

mac 和 window 的特殊 DNS

或者,如果您是 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您可以ifconfig在linux中使用的主机IP在哪里。

因此,您拥有灵活的 DNS,可以在所有平台 Linux、window 和 mac 上运行,您无需修改​​代码。

于 2020-07-22T14:33:00.287 回答
1

如果您尝试从容器 ping localhost,容器将 ping 自身 :)
如果您想从容器访问在主机本身上运行的服务,您需要获取 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 从 continer 访问您的 API。
PS:适用于Linux。如果您在 Win 或 Mac 上运行 Docker,则需要执行其他操作。

于 2020-07-22T14:19:12.963 回答
0

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

__

假设您有 2 个 docker 映像

第一张图片: Fastapi 或任何其他使用 Docker 包装的 API 后端。

第二张图片:使用 Docker 包装的 Streamlit 前端

现在,当您从 streamlit docker 向另一个 docker 请求 API 时,例如(localhost://predict),它将无法工作。

因为你被请求 API 当前 localhost 到同一个 docker localhost 并且它指向它自己。

因此,您需要将 streamlit 脚本中存在的 localhost 更改为所需的 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

现在运行streamlit docker,

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

完成✅

于 2021-11-08T10:38:38.443 回答