首页 > 编程问答 >从 jupyter 笔记本连接到容器化 postgresql

从 jupyter 笔记本连接到容器化 postgresql

时间:2024-07-28 10:29:30浏览次数:10  
标签:python postgresql docker jupyter psycopg2

我有一个运行 postgresql 的容器,我想摄取一些我在 ETL 脚本中准备好的数据。我已经创建了数据库,但是,当我尝试通过 jupyter 笔记本连接本地计算机时,它一直说找不到主机,即使我在 .yaml 文件中设置了它。 我的 .yaml 文件是这样的:

version: '3.7'
services:
  postgres:
    image: library/postgres
    container_name: postgres_db
    restart: unless-stopped
    ports:
      - 5432:5432
    environment:
      - POSTGRES_PASSWORD=password123
      - POSTGRES_USER=user123
      - POSTGRES_DB=my_db
    hostname: postgres
    volumes:
      - ./pgdata/data:/var/lib/postgresql/data
      - ./initdb:/docker-entrypoint-initdb.d
    

在我的 jupyter 笔记本中,我有这个连接测试:

import psycopg2

DATABASE_HOST = 'postgres'  
DATABASE_PORT = 5432
DATABASE_USER = 'user123'
DATABASE_PASSWORD = 'password123'
DATABASE_NAME = 'my_db'

conn = psycopg2.connect(
        host=DATABASE_HOST,
        port=DATABASE_PORT,
        user=DATABASE_USER,
        password=DATABASE_PASSWORD,
        dbname=DATABASE_NAME
    )

docker 端的日志永远不会随着任何类型的连接尝试而返回。

OperationalError: could not translate host name "postgres" to address: Unknown host

遇到的错误是因为的 Jupyter 笔记本无法识别 postgres 主机名。 这是因为 postgres 主机名特定于的 Docker 网络。

以下是如何解决此问题的几种方法:

1. 使用端口转发将 localhost 连接到容器

  • 不需要修改 Docker Compose 文件。
  • 通过以下命令启动的容器(如果尚未运行): bash docker-compose up -d
  • 使用以下代码连接到的数据库,将主机名替换为 localhost

```python import psycopg2

DATABASE_HOST = 'localhost'
DATABASE_PORT = 5432 DATABASE_USER = 'user123' DATABASE_PASSWORD = 'password123' DATABASE_NAME = 'my_db'

conn = psycopg2.connect( host=DATABASE_HOST, port=DATABASE_PORT, user=DATABASE_USER, password=DATABASE_PASSWORD, dbname=DATABASE_NAME ) ```

这将通过映射到主机上的端口 5432 的端口 5432 连接到的 Postgres 容器。

2. 将 Jupyter 连接到 Docker 网络

  • 此方法允许使用容器名称 postgres 作为主机名。
  • 获取 Docker 网络的名称: bash docker network ls 找到与的 Postgres 容器关联的网络(可能是类似 something_default 的名称)。
  • 将的 Jupyter 笔记本连接到该网络(将 network_name 替换为的实际网络名称): bash docker network connect network_name <jupyter_container_name_or_id> 需要知道正在运行的 Jupyter 容器的名称或 ID。
  • 现在,应该能够使用 postgres 作为主机名连接到的数据库,如的原始代码所示。

3. 使用容器的 IP 地址

  • 获取的 Postgres 容器的 IP 地址: bash docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres_db
  • 在的 Python 代码中,将 DATABASE_HOST 替换为获取的 IP 地址:

```python DATABASE_HOST = '172.17.0.2' # 替换为的容器的实际 IP 地址 DATABASE_PORT = 5432 DATABASE_USER = 'user123' DATABASE_PASSWORD = 'password123' DATABASE_NAME = 'my_db'

conn = psycopg2.connect( host=DATABASE_HOST, port=DATABASE_PORT, user=DATABASE_USER, password=DATABASE_PASSWORD, dbname=DATABASE_NAME ) ```

选择最适合的方法。 如果只是想快速进行测试,第一个选项是最简单的。 如果需要从 Jupyter 笔记本中更永久地访问的数据库,则第二个选项更好。 第三个选项提供了另一种选择,但如果的容器重新启动并且其 IP 地址发生更改,则可能需要进行手动更新。

标签:python,postgresql,docker,jupyter,psycopg2
From: 78802845

相关文章