docker container连接本地postgresql

时间:2017-07-27 04:37:35

标签: python postgresql docker

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

我在端口5432上运行了postegresql,创建了datatbase并授予用户。

运行docker comand

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连接?

3 个答案:

答案 0 :(得分:0)

这取决于您的主机操作系统和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 DNS名称{{1这将解析为主机使用的内部IP地址。

在Linux上直接使用主机模式,其中安装了docker.for.mac.localhost的图像:

ifconfig

答案 1 :(得分:0)

读到你在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容器的名称{ {1}})。

如果python容器找不到主机“postgres”,请在输入命令--name时使用显示的IP进行尝试。

答案 2 :(得分:0)

要修复此错误:

首先,它不起作用是正常的,因为postgresql不在与应用程序相同的容器中运行,因此主机localhost:5432不存在。 要解决这个问题 : 在属性文件nottead localhost:5432上,使用IPadresse(如IP:5432),然后在pg_hba.conf中添加此文件 托管所有0.0.0.0/0 md5