Docker端口映射正常但无法访问容器内Uvicorn部署的API故障排查
问题产生原因
- 核心原因是UVicorn默认绑定的是容器内部的环回地址
127.0.0.1,这个地址仅支持容器内部访问,宿主机的外部请求无法触达容器内的服务 - 当前Dockerfile中使用的
--reload是开发热重载参数,仅适合本地开发调试场景,不建议在容器化部署时保留
解决方案
方法1:修改Dockerfile的启动指令(推荐)
在UVicorn启动参数中添加--host 0.0.0.0,让服务监听容器所有网卡的请求,修改后的CMD指令如下:
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
如果确实需要保留热重载的开发调试能力,也可以保留--reload参数:
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
修改后重新执行镜像构建、容器启动命令即可正常访问。
方法2:启动容器时覆盖启动命令(无需修改Dockerfile)
如果不想改动现有Dockerfile,可以在执行docker run时直接覆盖启动指令:
sudo docker run -d -p 8000:8000 test uvicorn main:app --host 0.0.0.0 --port 8000
内容的提问来源于stack exchange,提问作者amrha
相关产品推荐
相关产品推荐

