You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI应用Docker部署后访问报Connection refused问题求助

Docker部署FastAPI提示Connection refused的修复方案

问题根因

你当前配置里最核心的问题是启动命令加了--reload热重载参数。这个参数是本地开发调试用的,会额外启动文件监听进程,在Docker的隔离环境下经常出现子进程端口绑定失效的问题——哪怕日志显示服务已经在0.0.0.0:8000启动,实际端口也可能没有正常对外监听,外部请求直接被拒绝。你之前做的端口调整、EXPOSE配置增减都没有触碰到这个核心问题。

修复操作

1. 调整Dockerfile配置

首先修改启动命令,去掉--reload参数,同时可以优化下依赖安装逻辑减小镜像体积,修改后的Dockerfile参考:

FROM python:3.7-slim

WORKDIR /app/
COPY . /app/

# 合并apt安装命令,安装完成后清理缓存减小镜像体积
RUN apt-get update && apt-get install -y --no-install-recommends \
    apt-utils \
    curl \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*

# 安装python依赖时加--no-cache-dir避免缓存占空间
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8000

# 去掉--reload,参数用空格分隔兼容性更好,明确指定监听地址和端口
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

补充:uvicorn的参数虽然支持--host=0.0.0.0这种等号写法,但在容器环境下用空格分隔参数的写法解析更稳定,不容易出现参数不生效的问题。

2. 重新部署容器

先清理之前创建的异常容器,再重新构建镜像启动:

# 强制删除旧的测试容器
docker rm -f test_cont
# 重新构建镜像
docker build -t ml_app:latest .
# 启动容器,加-d参数让容器后台运行
docker run -d -p 8000:8000 --name test_cont ml_app:latest

3. 连通性验证

启动后不要直接在宿主机测,先在容器内部确认服务正常:

# 在容器内部调用docs接口
docker exec -it test_cont curl http://127.0.0.1:8000/docs

如果这条命令能正常返回FastAPI默认文档的HTML内容,说明容器内服务运行正常,此时再在宿主机访问http://localhost:8000即可正常连通。

其他异常排查方向

如果按上面步骤修改后还是连接失败,按顺序排查:

  • 宿主机8000端口被其他程序占用:修改端口映射为比如-p 8001:8000,访问宿主机8001端口测试
  • 云服务器部署场景:检查安全组规则、系统防火墙(firewalld/ufw)是否开放了对应映射端口
  • 代码配置冲突:检查main.py里有没有手动配置uvicorn启动时绑定127.0.0.1的逻辑,避免覆盖启动参数
  • 不要在启动参数里把host设为127.0.0.1,必须绑定0.0.0.0才能让容器外部的请求访问到服务

内容的提问来源于stack exchange,提问作者Matheus Rosso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:03:31