簡體   English   中英

連接 Airflow Docker 轉 PostgreSql Docker

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM