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

无法通过VPS在公网访问Docker部署的Flask REST API求助

问题描述

我基于Flask实现了一个基础REST API,本地Docker容器化运行正常,但部署到VPS后无法从公网访问。已完成以下操作:

  • 成功构建Docker镜像:docker build -t myapp:latest
  • 启动容器:docker run --rm -it -p 8080:5000 myapp:latest
  • 容器日志显示服务运行在http://127.0.0.1:5000和http://172.17.0.2:5000
  • 尝试用Postman访问172.17.0.2:8080/users时出现请求超时错误
解决方案

1. 修正访问地址

容器的172.17.0.2是VPS内部的Docker网桥私有IP,公网无法直接访问。你需要使用VPS的公网IP加上映射的端口8080来访问API,格式为:

http://<你的VPS公网IP>:8080/users

2. 开放VPS端口权限

多数VPS默认会限制外部访问非标准端口,需从两个层面配置:

  • 操作系统防火墙:
    • 若使用ufw(Ubuntu/Debian):
      sudo ufw allow 8080/tcp
      sudo ufw reload
      
    • 若使用firewalld(CentOS/RHEL):
      sudo firewall-cmd --add-port=8080/tcp --permanent
      sudo firewall-cmd --reload
      
  • 服务商安全组:登录VPS管理后台,在安全组规则中添加入站规则,允许TCP协议的8080端口访问(来源可设为0.0.0.0/0允许所有公网IP访问)。

3. 验证端口映射有效性

在VPS终端执行以下命令,检查8080端口是否已绑定到主机的所有网卡:

netstat -tulpn | grep 8080

若输出包含0.0.0.0:8080,说明端口映射生效;若仅显示127.0.0.1:8080,则映射未正确配置,需重新启动容器。

4. 确保Flask服务绑定到所有网卡

虽然你的app.py中写了app.run(debug=True, host="0.0.0.0"),但日志仍显示服务绑定到127.0.0.1,可能存在执行分支问题。可以:

  • 强制在启动命令中指定host:修改Dockerfile的CMD为:
    CMD ["app.py", "--host", "0.0.0.0"]
    
  • 或在app.py中明确指定端口和host:
    if __name__ == '__main__':
        app.run(debug=True, host="0.0.0.0", port=5000)
    

5. 修复数据库连接隐患

你的SQLALCHEMY_DATABASE_URI配置为mysql://username:pwd@127.0.0.1/test,在容器内127.0.0.1指向容器自身,而非VPS主机的MySQL服务。若MySQL部署在VPS主机上:

  • 改为VPS的内网IP(比如192.168.x.x)
  • 或使用host.docker.internal(部分Docker环境支持直接访问主机服务)
  • 推荐方案:将MySQL也容器化,加入同一Docker网络,通过容器名访问数据库。

6. 清理代码冗余

app.py中重复定义了User类,会触发SQLAlchemy警告,建议删除其中一个重复的类定义,保留完整的版本即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:43:11