psycopg2连接Docker中PostgreSQL报主机名无法解析问题
问题原因
连不上核心是两个问题:
- 你写的
host="postgres"是Docker Compose给同网络容器分配的内部域名,只有和PostgreSQL容器在同一个Docker网络里的其他容器能解析这个域名,你现在Jupyter跑在宿主机上,不在容器内网里,自然识别不了这个主机名,报未知主机错误。 - 改成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服务点停止
- Linux执行:
- 重启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
相关产品推荐
相关产品推荐

