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

psycopg2连接Docker中PostgreSQL报主机名无法解析问题

问题原因

连不上核心是两个问题:

  1. 你写的host="postgres"是Docker Compose给同网络容器分配的内部域名,只有和PostgreSQL容器在同一个Docker网络里的其他容器能解析这个域名,你现在Jupyter跑在宿主机上,不在容器内网里,自然识别不了这个主机名,报未知主机错误。
  2. 改成localhost/127.0.0.1连到本地库,是因为你宿主机自己装的PostgreSQL服务已经占了5432默认端口,Compose里配的PostgreSQL容器根本没绑上宿主机的5432端口,所有发往宿主机5432的请求都被本地PostgreSQL接了,当然连不到容器里的库。

现有docker-compose.yml里PostgreSQL的配置本身没有问题,不需要调整项目业务配置,按下面的方法改连接方式就行。

解决方案

方案1:停掉本地PostgreSQL(不需要同时用本地库的场景选这个)

  • 先把宿主机上跑的本地PostgreSQL服务停了,释放5432端口:
    • Linux执行:sudo systemctl stop postgresql
    • macOS用brew装的执行:brew services stop postgresql
    • Windows直接在服务面板里找到PostgreSQL服务点停止
  • 重启Compose里的PostgreSQL容器,让它能正常绑定宿主机5432端口:
    docker compose restart postgres
    
  • 执行docker ps看PostgreSQL容器的端口列,显示0.0.0.0:5432->5432/tcp就是绑定成功了
  • 注意:连接时host填127.0.0.1,别填localhost,部分环境下localhost会走本地Unix Socket连本地库,还是会连错,连接代码示例:
    import psycopg2
    connector = psycopg2.connect(
        database="postgres",
        user="postgres",
        password="postgres",
        host="127.0.0.1",
        port="5432"
    )
    

方案2:改容器映射端口(需要同时用本地和容器PostgreSQL的场景选这个)

不想停本地PostgreSQL的话,直接改docker-compose.yml里PostgreSQL的端口映射,把宿主机端口换成没被占用的,比如5433:

postgres:
    restart: always
    image: postgres:latest
    hostname: postgres
    ports:
      - "5433:5432" # 冒号左边是宿主机端口,可以自己改随便哪个没被占的
    volumes:
      - pgdata:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
  • 改完执行下面的命令重载配置启动容器:
    docker compose up -d postgres
    
  • 连接的时候host填127.0.0.1,port填你刚才设的宿主机端口(比如5433),就能连到容器里的库,和本地5432的库互不干扰。

方案3:Jupyter本身跑在Docker容器里的场景

如果你用的Jupyter也是容器部署的,不用映射端口,直接把Jupyter容器加到当前Compose项目的Docker网络里,连接的时候host填postgres就能直接通过容器内网连通。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:57:17