Streamlit Docker无法通过内部URL访问仅可使用localhost访问问题咨询
问题复现示例
Dockerfile
FROM python:3.8 WORKDIR /app RUN pip install streamlit ENTRYPOINT ["streamlit", "run", "app.py"]
所用Docker命令
docker build -t streamlit-app:latest . docker run -ti streamlit-app:latest
差异原因
这个问题和M1芯片本身没有直接关联,本质是Docker在Linux和MacOS上的底层网络架构不同导致的,Intel芯片的Mac设备运行Docker Desktop也会出现相同现象。
- Ubuntu是Linux系统,Docker直接基于内核的网络模块运行,默认bridge网络下的容器会分配独立的内部IP,宿主机和同一Docker网络下的服务可以直接通过内部IP+容器端口访问,不需要额外配置就能连通。
- MacOS没有Docker依赖的Linux内核特性,Docker Desktop for Mac底层会运行一个轻量Linux虚拟机,所有容器都跑在这个虚拟机内部:虚拟机的Docker内部网络和MacOS宿主机网络是二层隔离的,MacOS默认没有去往Docker内部子网的路由,所以无法直接访问容器的内部IP。你能通过
localhost:8501访问,是Docker Desktop默认做了隐式端口转发,将容器暴露的端口映射到了MacOS的本地环回接口,仅本地可访问。
如果需要让同局域网的其他设备也能访问这个Streamlit服务,启动容器时显式绑定端口到所有网卡即可:
docker run -ti -p 0.0.0.0:8501:8501 streamlit-app:latest
绑定后可以通过Mac的局域网IP+8501端口访问服务,但依然无法直接访问容器的内部IP,这是Docker Desktop for Mac的架构限制,目前没有通用的绕过方案。
内容的提问来源于stack exchange,提问作者dracarys3
相关产品推荐
相关产品推荐

