WSL2环境下Docker部署Flask项目无法连接本地PostgreSQL数据库
解决方案:Docker容器中Flask连接本地PostgreSQL失败
问题核心
Docker容器内的localhost指向容器自身,而非你的宿主机(Ubuntu系统),所以Flask用localhost无法访问宿主机上的PostgreSQL服务。
方案1:使用宿主机IP地址连接
获取宿主机IP:在Ubuntu终端执行命令:
hostname -I得到类似
192.168.1.100的IP地址。修改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"更新PostgreSQL访问控制:编辑
pg_hba.conf,添加允许宿主机IP段访问的规则(比如你的IP是192.168.1.x):host all all 192.168.1.0/24 trust然后重启PostgreSQL服务:
sudo service postgresql restart重新构建并启动容器:
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
相关产品推荐
相关产品推荐

