[英]Connection Airflow Docker to PostgreSql Docker
我在Docker中使用Airflow和PostgreSQL。
所以我在5433端口建立了一個PostgreSQL的數據庫容器(384eaa7b6efb)。 這是我想要用 Airflow 中的 dag 獲取數據的地方。
docker 秒
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
384eaa7b6efb postgres "docker-entrypoint.s…" 4 hours ago Up 4 hours
0.0.0.0:5433->5432/tcp test-instance
421d443540fb apache/airflow:2.0.1 "/usr/bin/dumb-init …" 18 hours ago Up 4 hours (healthy)
0.0.0.0:8080->8080/tcp airflow_docker-airflow-webserver-1
ff4bea4f16dd apache/airflow:2.0.1 "/usr/bin/dumb-init …" 18 hours ago Up 4 hours
8080/tcp airflow_docker-airflow-scheduler-1
4cead3ee6667 postgres:13 "docker-entrypoint.s…" 18 hours ago Up 4 hours (healthy)
5432/tcp airflow_docker-postgres-1
8bb2cefd456e apache/airflow:2.2.0 "/usr/bin/dumb-init …" 4 days ago Up 5 hours (healthy)
0.0.0.0:5555->5555/tcp, 8080/tcp airflow_docker-flower-1
5c4b96d9c5a0 apache/airflow:2.2.0 "/usr/bin/dumb-init …" 4 days ago Up 5 hours (healthy)
8080/tcp airflow_docker-airflow-worker-1
3442eae78844 apache/airflow:2.2.0 "/usr/bin/dumb-init …" 4 days ago Restarting (1) 11 seconds ago airflow_docker-airflow-triggerer-1
7e945051435f redis:latest "docker-entrypoint.s…" 4 days ago Up 5 hours (healthy)
6379/tcp airflow_docker-redis-1
我在 PgAdmin 上創建了一個新的服務器連接來訪問我的數據庫:
我可以看到我的數據,一切都很好。
所以現在我創建了這個 dag 來查詢該數據庫中的數據:
def queryPostgresql():
conn_string="dbname='postgres' host='localhost' port='5433' 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 運行 dag 時,
[2021-10-17 14:37:16,485] {taskinstance.py:1455} ERROR - could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?
我在這里做錯了什么? 這是我應該添加連接的方式嗎?
我有幾乎相同的配置。 如果您的所有容器都在同一個網絡中,您可以通過<postgres-container-name>:<port>
訪問您的數據庫(在您的情況下test-instance:5433
)
將主機更改為; host.docker.internal
。
這取決於您使用的操作系統。 為了從容器內訪問主機的網絡,您需要在 docker 中使用主機的 IP 地址。 方便的是,在 Windows 和 Max 上,這是使用容器內的域host.docker.internal
解決的。 如docker 文檔中所述:
我想從容器連接到主機上的服務
主機有一個不斷變化的 IP 地址(如果您沒有網絡訪問權限,則沒有)。 我們建議您連接到解析為主機使用的內部 IP 地址的特殊 DNS 名稱 host.docker.internal。 這是出於開發目的,不適用於 Docker Desktop for Mac 之外的生產環境。
在 linux 中還有一個解決方法,已經在What is linux相當於“host.docker.internal”中得到了回答
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.