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

Flask Docker容器连接PostGIS容器报Connection refused错误求助

问题根源

每个Docker容器默认拥有独立的网络命名空间,容器内的localhost指向容器本身,而非宿主机或其他容器。
你在本地直接运行Flask时,请求localhost:5432实际访问的是宿主机的5432端口,该端口已经通过--publish 5432:5432参数映射到PostGIS容器的5432端口,所以可以正常连通。
当Flask打包到容器内运行时,请求localhost:5432访问的是Flask容器自身的5432端口,该端口没有运行数据库服务,因此抛出连接拒绝错误。
你之前遇到的多容器无需额外配置即可连通的情况,通常是两种场景:要么容器启动时指定了--net=host主机网络模式,共享宿主机网络命名空间;要么两个容器已经被加入同一个自定义桥接网络,且连接时使用容器名作为数据库地址而非localhost。

解决方案

以下方案均无需使用Docker Compose即可实现:

  • 方案1:自定义Docker网络+容器名作为连接地址(最推荐)
    自定义桥接网络内置DNS解析能力,可直接通过容器名访问对应容器,隔离性好且配置灵活。
    1. 首先创建自定义网络:docker network create app-network
    2. 启动PostGIS容器时新增参数加入该网络,原有命令调整为:
    docker run \
        --name some-postgis \
        --network app-network \
        --publish 5432:5432 \
        --env POSTGRES_PASSWORD='password' \
        --env POSTGRES_DB='my-database' \
        -d postgis/postgis
    
    1. 启动Flask容器时也加入同一个网络,启动命令新增--network app-network参数
    2. 修改Flask应用的数据库连接地址,将原localhost:5432替换为some-postgis:5432即可
  • 方案2:Flask容器使用宿主机网络
    启动Flask容器时添加--net=host参数,容器会共享宿主机的网络命名空间,此时容器内的localhost等同于宿主机的localhost,原有数据库连接配置不需要修改即可正常连接。该方案网络隔离性较差,仅推荐开发测试场景使用。
  • 方案3:使用宿主机IP作为连接地址
    将Flask应用的数据库连接地址中的localhost替换为宿主机的局域网IP(如192.168.1.100:5432)即可连通,无需调整容器启动参数。该方案缺点是宿主机IP变动时需要同步修改配置,灵活性较差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:36:01