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解析能力,可直接通过容器名访问对应容器,隔离性好且配置灵活。- 首先创建自定义网络:
docker network create app-network - 启动PostGIS容器时新增参数加入该网络,原有命令调整为:
docker run \ --name some-postgis \ --network app-network \ --publish 5432:5432 \ --env POSTGRES_PASSWORD='password' \ --env POSTGRES_DB='my-database' \ -d postgis/postgis- 启动Flask容器时也加入同一个网络,启动命令新增
--network app-network参数 - 修改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
相关产品推荐
相关产品推荐

