FastAPI + Docker:连接被拒绝

Mat*_*sso 8 windows docker fastapi

每个人!

我在使用 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"]
Run Code Online (Sandbox Code Playgroud)

注意:我必须构建的 API 是以 ML 为中心的,因此我需要声明一些如上所述的包,以便可以使用 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日志只返回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.
Run Code Online (Sandbox Code Playgroud)

我尝试使用 FastAPI 在运行容器时指示的 URL (http://localhost:8000)来访问 API 。我已使用浏览器、curl 和 Postman 的行命令针对此 URL 发送了请求。

我尝试过以下一些方法来解决这个问题

  1. 更改端口。
  2. 使用和不使用 EXPOSE 命令。
  3. 运行 Python 脚本而不是显式使用 uvicorn。
  4. 公开与 uvicorn 参数中声明的端口不同(且相同)的端口。

那么,有人明白我做错了什么吗?或者我应该如何访问部署在容器中的API?

谢谢你们!

小智 3

运行 docker container 后,尝试http://localhost:80代替http://0.0.0.0:8000(docker 日志上显示的内容)。