当 运行 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 更改为 ,
然后再次构建 streamlit docker。
docker build -t frontend: version-1
现在运行 docker
docker run --rm -it -p 8501/8501/tcp frontend:version-1
完成 ✅
我有一个 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 reachlocalhos: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 更改为 ,
然后再次构建 streamlit docker。
docker build -t frontend: version-1
现在运行 docker
docker run --rm -it -p 8501/8501/tcp frontend:version-1
完成 ✅