Docker部署FastAPI后端与Streamlit前端:连接重试超限问题
解决容器间API调用失败的问题
问题核心
前端容器内的127.0.0.1或localhost指向的是前端容器自身,而非你的Mac宿主机器,所以无法访问宿主映射的8000端口对应的后端容器。
解决方案1:使用自定义Docker网络(手动启动容器)
- 创建自定义网络
docker network create my-app-network - 启动后端容器并加入网络
给后端容器指定可识别名称(比如fastapi-backend),同时加入自定义网络:docker run --name fastapi-backend --network my-app-network -p 8000:80 <你的后端镜像名> - 启动前端容器并加入同一网络
docker run --name streamlit-frontend --network my-app-network -p 8081:8501 <你的前端镜像名> - 修改前端API请求地址
前端代码里的API调用地址改为:# 用后端容器的名称作为域名,端口用容器内的80(而非宿主映射的8000) response = requests.get("http://fastapi-backend:80/blogs/all")
解决方案2:使用Docker Compose(更便捷的方式)
Docker Compose会自动创建专属网络,服务名可直接作为容器间通信的域名:
- 编写
docker-compose.yml文件:version: '3.8' services: backend: build: ./backend # 替换为你的后端代码目录 ports: - "8000:80" frontend: build: ./frontend # 替换为你的前端代码目录 ports: - "8081:8501" depends_on: - backend # 确保后端先启动 - 启动所有容器:
docker-compose up -d - 修改前端API请求地址为:
response = requests.get("http://backend:80/blogs/all")
为什么之前的尝试无效?
localhost/127.0.0.1:在容器环境中,这两个地址指向容器自身,而非宿主机器。- 宿主IP:Mac上Docker默认bridge网络下,容器访问宿主需用
host.docker.internal,但这种方式依赖宿主网络配置,不如自定义网络稳定。 - 端口使用错误:你之前用的8000是宿主到后端容器的映射端口,容器间通信应直接用后端容器内部的80端口。
内容的提问来源于stack exchange,提问作者Ramon Santiago
相关产品推荐
相关产品推荐

