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

WSL2环境下Docker部署Flask项目无法连接本地PostgreSQL数据库

解决方案:Docker容器中Flask连接本地PostgreSQL失败

问题核心

Docker容器内的localhost指向容器自身,而非你的宿主机(Ubuntu系统),所以Flask用localhost无法访问宿主机上的PostgreSQL服务。


方案1:使用宿主机IP地址连接

  1. 获取宿主机IP:在Ubuntu终端执行命令:

    hostname -I
    

    得到类似192.168.1.100的IP地址。

  2. 修改Flask数据库配置:将SQLALCHEMY_DATABASE_URI中的localhost替换为上述宿主机IP:

    pg_user = "postgres"
    pg_pwd = "1404"
    pg_port = "5433"
    pg_host = "192.168.1.100"  # 替换成你的宿主机IP
    SQLALCHEMY_DATABASE_URI = f"postgresql://{pg_user}:{pg_pwd}@{pg_host}:{pg_port}/flaskproject"
    
  3. 更新PostgreSQL访问控制:编辑pg_hba.conf,添加允许宿主机IP段访问的规则(比如你的IP是192.168.1.x):

    host    all             all             192.168.1.0/24            trust
    

    然后重启PostgreSQL服务:

    sudo service postgresql restart
    
  4. 重新构建并启动容器:

    docker-compose down && docker-compose up --build
    

方案2:使用Docker Host网络模式

让容器直接使用宿主机的网络栈,这样容器内的localhost就等价于宿主机的localhost。

修改docker-compose.yaml,添加network_mode: host:

version: '3.3'
services:
  web:
    build: .
    network_mode: host
    # 注意:使用host网络时,ports映射可以注释掉,因为容器直接用宿主机端口
    # ports:
    #   - 5000:5000

重新启动容器即可,无需修改Flask的数据库配置(因为此时容器内localhost指向宿主机)。


方案3:将PostgreSQL加入Docker Compose(推荐)

把PostgreSQL也作为Docker服务运行,这样可以通过服务名直接连接,避免宿主机IP变化的问题。

修改docker-compose.yaml:

version: '3.3'
services:
  web:
    build: .
    ports:
      - 5000:5000
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_USER=postgres
      - DB_PASSWORD=1404
      - DB_PORT=5432
      - DB_NAME=flaskproject
  db:
    image: postgres:13-alpine
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=1404
      - POSTGRES_DB=flaskproject
    ports:
      - 5433:5432  # 宿主机端口5433映射到容器内5432
    volumes:
      - postgres_data:/var/lib/postgresql/data/

volumes:
  postgres_data:

然后修改Flask配置:

import os
pg_user = os.getenv("DB_USER", "postgres")
pg_pwd = os.getenv("DB_PASSWORD", "1404")
pg_port = os.getenv("DB_PORT", "5432")
pg_host = os.getenv("DB_HOST", "db")
SQLALCHEMY_DATABASE_URI = f"postgresql://{pg_user}:{pg_pwd}@{pg_host}:{pg_port}/flaskproject"

最后启动服务:

docker-compose up --build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:20:55