Docker部署的Airflow连接独立PostgreSQL容器报Connection refused如何解决
问题根因
你遇到的连接拒绝错误核心是Docker容器网络隔离机制导致的:
- 你的Airflow所有服务(调度器、工作器等)都运行在独立的Docker容器中,代码里写的
host='localhost'指向的是Airflow容器自身的本地环境,而不是宿主机的本地环境 - PgAdmin是直接运行在宿主机上的,所以用
localhost:5433可以正常访问到端口映射后的PostgreSQL服务,Airflow容器里没有这个端口映射,自然访问失败。
正确的连接配置方案
方案1:通过Docker容器名直接内网访问(更稳定,推荐)
同一个Docker网络下的容器可以直接通过容器名互访,不需要走宿主机端口映射:
- 先确认你的PostgreSQL容器
test-instance和Airflow服务在同一个Docker网桥下,如果不在可以用命令加入:docker network connect <airflow所在网桥名> test-instance - 修改DAG里的连接字符串:
def queryPostgresql(): # host填PostgreSQL的容器名,端口用容器内部的5432,不需要用映射后的5433 conn_string="dbname='postgres' host='test-instance' port='5432' user='postgres' password='admin'" conn=db.connect(conn_string) df=pd.read_sql("select name,city from public.users",conn) df.to_csv('postgresqldata.csv') print("-------Data Saved------")
如果用Airflow自带的连接管理界面配置,参数如下:
- 连接类型:Postgres
- Host:
test-instance - Schema:
postgres - Login:
postgres - Password:
admin - Port:
5432
方案2:用宿主机IP访问
如果不想调整Docker网络配置,可以把连接字符串里的localhost换成宿主机的局域网IP,端口保持5433即可,注意宿主机防火墙要开放5433端口的内部访问权限。
内容的提问来源于stack exchange,提问作者Simon GIS
相关产品推荐
相关产品推荐

