FastAPI + Docker: 连接被拒绝

8

大家好!

我正在使用Docker容器部署FastAPI应用程序时遇到问题。 我已经测试过不使用Docker,仅使用FastAPI进行部署,一切正常。 但是当我使用Docker时,我无法访问API,只得到“连接被拒绝”的消息。

这是我正在使用的Dockerfile

FROM python:3.7-slim

WORKDIR /app/
COPY . /app/

RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
RUN apt-get -y install curl
RUN apt-get install libgomp1

RUN pip install -r requirements.txt

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host=0.0.0.0", "--reload"]

注意:我需要构建的API专注于机器学习,因此我需要声明一些包以便使用LightGBM。
构建Dockerfile后,我运行了以下Docker命令:
docker build -t ml_app:latest .
docker run -p 8000:8000 --name test_cont ml_app:latest
当我使用 docker ps 检查正在运行的容器时,我发现该容器正常工作,如图所示: docker ps 此外,docker logs 只返回 FastAPI 的默认消息。
INFO:     Will watch for changes in these directories: ['/app']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [1] using statreload
INFO:     Started server process [7]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

我正在尝试使用FastAPI在运行容器时指定的URL(http://localhost:8000)访问API。 我已经使用浏览器,curl和Postman发送了针对此URL的请求。
以下是我尝试解决此问题的方法:
1. 更改端口。 2. 使用和不使用EXPOSE命令。 3. 运行Python脚本而不是明确使用uvicorn。 4. 公开与uvicorn参数声明的端口不同(且相等)的端口。
那么,有人知道我做错了什么吗? 或者我应该怎样访问部署在容器中的API?
谢谢大家!

1
我在这里没有看到任何关于您如何尝试访问API的信息。此外,您是否检查了容器日志以查找任何错误或警告? - larsks
谢谢您的回答,我会编辑问题。但基本上我正在尝试使用FastAPI指示的URL(localhost:8000)在浏览器中或通过curl(甚至使用Postman)访问,始终针对localhost:8000发出请求。 - Matheus Rosso
这里的一切看起来都很好,如果我在本地复制您的配置,则完全正常(也就是说,在主机上,我可以通过浏览器或curl连接到http:// localhost:8000并查看预期的响应)。 您正在Linux,MacOS还是Windows下运行? - larsks
我现在正在一台Windows 8机器上运行。 - Matheus Rosso
1
我也遇到了同样的问题,但是在Kubernetes下。如果我在本地运行脚本,我可以连接。如果我在本地机器上的Docker中运行脚本,我也可以连接。只有在K8s中运行时会失败,并且真正奇怪的是,它并不总是发生(但相当频繁)。 - GergelyPolonkai
1
你解决了这个问题吗?我也遇到了同样的问题。@MatheusRosso - Dolphin
2个回答

1
在运行docker容器后,尝试使用http://localhost:80而不是http://0.0.0.0:8000(docker日志中显示的内容)。

0
我在我的fastapi项目中遇到了类似的问题,下面是解决方案。只需按照以下方式运行dockerfile即可。
sudo docker run -p 8000:8000 tagged_project_name

如果您尚未为项目打上标签,在构建时请按照以下步骤进行操作,在构建成功后执行上述命令。
sudo docker build -f dockerfile_name -t tagged_project_name .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接