Docker中PySpark/Jupyter Notebook连接本地PostgreSQL遇拒问题求助
修改PostgreSQL监听配置
编辑PostgreSQL配置文件postgresql.conf(通常路径为/etc/postgresql/<version>/main/postgresql.conf),找到listen_addresses参数,将其值改为'*',允许PostgreSQL监听所有网络接口。修改后重启PostgreSQL服务:sudo systemctl restart postgresql配置PostgreSQL访问权限
编辑pg_hba.conf(同目录下),添加一条允许Docker容器网段访问的规则。Docker默认使用172.17.0.0/16网段,添加以下内容:host all all 172.17.0.0/16 scram-sha-256(如果你的PostgreSQL使用的是md5认证,替换
scram-sha-256为md5),之后重启PostgreSQL服务。放行防火墙端口
确保宿主机防火墙允许5432端口(PostgreSQL默认端口)的入站请求,以Docker网段为例:sudo ufw allow from 172.17.0.0/16 to any port 5432(如果使用其他防火墙工具,比如firewalld,对应调整命令)
使用宿主机实际IP构造连接URL
不要依赖localhost或host.docker.internal,直接用宿主机在局域网内的实际IP地址(比如192.168.1.100)构造PySpark的JDBC连接URL:df = spark.read.format("jdbc") \ .option("url", "jdbc:postgresql://192.168.1.100:5432/your_database_name") \ .option("dbtable", "your_table_name") \ .option("user", "your_db_user") \ .option("password", "your_db_password") \ .option("driver", "org.postgresql.Driver") \ .load()注意要确保容器内已经包含PostgreSQL的JDBC驱动(可以在启动容器时挂载驱动包,或者使用预装驱动的镜像)。
可选:通过Unix套接字连接
如果上述方法仍不生效,可以将宿主机的PostgreSQL套接字目录挂载到容器中。启动容器时添加挂载参数:docker run -v /var/run/postgresql:/var/run/postgresql ...然后构造连接URL时指定套接字路径:
df = spark.read.format("jdbc") \ .option("url", "jdbc:postgresql://localhost/your_database_name?socketFactory=org.postgresql.core.PGStreamSocketFactory&socketPath=/var/run/postgresql/") \ .option("dbtable", "your_table_name") \ .option("user", "your_db_user") \ .option("password", "your_db_password") \ .option("driver", "org.postgresql.Driver") \ .load()
内容的提问来源于stack exchange,提问作者Arun Kumar

