如何从另一运行中的Docker容器连接PostgreSQL容器
问题解决方法
核心错误原因
你的连接配置中host参数填写错误:my_network是你自定义的Docker桥接网络名称,并不是PostgreSQL容器的可解析主机名。Docker Compose会自动为同一网络下的服务做内部DNS解析,容器之间互相访问时直接使用docker-compose.yml中定义的服务名作为主机名即可。
修复方案
将你Python代码中的连接参数host从my_network修改为PostgreSQL对应的服务名db即可,其余参数保持不变,修改后代码如下:
import psycopg2 params = dict(host='db', database='spotify', user='postgres', password='mypassword', port='5432') conn = psycopg2.connect(**params)
原理解释
- 本地运行代码时可以用
localhost连接的原因:你在db服务配置中做了端口映射5432:5432,将容器内的5432端口暴露到了宿主机的5432端口,所以本地请求localhost:5432会被转发到PostgreSQL容器。 - 容器之间跨容器访问不走宿主机端口映射,直接通过Docker内部网络通信,Docker内置的DNS服务会直接把服务名解析为对应容器的内部IP,因此用服务名
db才能正常解析。
可选验证步骤
你可以进入data_collection容器的shell,执行以下命令验证网络连通性:
- 执行
ping db,可以正常收到响应说明服务名解析正常 - 执行
nc -zv db 5432,返回连接成功说明数据库端口可正常访问
内容的提问来源于stack exchange,提问作者RocketSocks22
相关产品推荐
相关产品推荐

