【问题标题】:docker container connect local postgresqldocker容器连接本地postgresql
【发布时间】:2018-01-02 15:16:30
【问题描述】:

我运行 python 容器,我想连接本地主机 postegresql。我尝试了一些方法。但不行。请跟我谈谈。我能怎么做 ?谢谢。

我已经在 5432 端口运行 postegresql,创建数据库并授予用户。

运行 docker 命令

docker run --name=python3 -v ${pwd}:/code -w /code python

python 代码

import psycopg2

def main():
    #Define our connection string
    conn_string = "host='localhost' dbname='testDB' user='test' password='test'"

    # print the connection string we will use to connect
    print ("Connecting to database\n    ->{}".format(conn_string))

    # get a connection, if a connect cannot be made an exception will be raised here
    conn = psycopg2.connect(conn_string)

    # conn.cursor will return a cursor object, you can use this cursor to perform queries
    cursor = conn.cursor()
    print ("Connected!\n")

if __name__ == "__main__":
    main()

错误信息

服务器是否在主机“localhost”(::1) 上运行并接受 端口 5432 上的 TCP/IP 连接? 无法连接到服务器:连接被拒绝 服务器是否在主机“localhost”(127.0.0.1)上运行并接受 端口 5432 上的 TCP/IP 连接?

【问题讨论】:

    标签: python postgresql docker


    【解决方案1】:

    修复此错误:

    首先,它不起作用是正常的,因为postgresql没有和应用程序在同一个容器中运行,所以主机localhost:5432不存在。 要解决这个问题 : 在属性文件上 istead localhost:5432 使用你的 IPadresse 像 IP:5432 并在 pg_hba.conf 添加这个 托管所有所有 0.0.0.0/0 md5

    【讨论】:

      【解决方案2】:

      得知您使用的是 Windows 10 并在主机上运行 postgresql,我建议您在容器中运行 postgresql。它使这种方式更容易。

      不过,要将 python 容器连接到 postgres 容器,您需要一个 docker 网络。我们称之为 postgres_backend。

      docker network create postgres_backend

      您可以使用以下命令创建 postgresql 容器。只需将 /path/to/store/data 更改为您要存储 postgres 数据的本地目录:

      docker run --name postgres \
        -e POSTGRES_PASSWORD=test \
        -e POSTGRES_USER=test \
        -d --restart always \
        -v /path/to/store/data:/var/lib/postgresql/data \
        --net postgres_backend \
        postgres:9.6
      

      现在您的 postresql 容器应该已经启动并运行了 :)

      要将您的 python 容器连接到它,您必须在 docker run 命令中添加一个--net postgres_backend,并将脚本中的主机更改为“postgres”(这是我们为 postgres 容器提供的名称,带有--name )。

      如果python容器找不到主机“postgres”,用输入命令docker exec -ti postgres ip addr show时显示的IP试试。

      【讨论】:

      • 您好,感谢您的解决方案。这个方法我试过了,效果很好,但是我只是想连接本地数据库,谢谢。
      • 也许这可以提供更多帮助:stackoverflow.com/questions/27556301/…
      【解决方案3】:

      这取决于您的主机操作系统和您的 docker 版本。
      我在这里假设您的数据库不是在容器本身中运行,而是在主机本身(localhost)上运行。

      例如,如“From inside of a Docker container, how do I connect to the localhost of the machine?”中所述,使用 Docker for Mac v 17.06 及更高版本(2017 年 6 月),您可以连接到特殊的 Mac 专用 DNS 名称 docker.for.mac.localhost,该名称将解析为内部 IP 地址主机使用。

      直接在 Linux 上,您将使用主机模式,并安装具有 ifconfig 的映像:

      docker run --network="host" -id <Docker image ID>
      

      【讨论】:

      • 嗨,我试试docker run --name=python3 -v ${pwd}:/code -w /code --network="host" python,但不行。我的操作系统是 Windows 10。数据库在本地机器上运行。不是容器。谢谢。我还需要做什么吗?
      • @frank 对于 Windows,可以使用桥接网络,并传递 Hyper-V IP 地址:stackoverflow.com/a/41077351/6309
      • @frank 注意:另一个答案是你是否在自己的容器中运行 postgreSQL,这不是你的问题。
      • @frank,编辑你的问题会很有用,指出 Postgres 正在 Windows 之上的虚拟机上运行。如您所说,它没有在 localhost 上运行
      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 2019-12-19
      • 2018-01-17
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2020-01-20
      相关资源
      最近更新 更多