无法从Python连接到Docker Postgresql实例

问题描述 投票:0回答:5

我正在使用 Docker 来“容器化”PostgreSQL 部署。我可以启动容器并通过命令行连接到 PostgreSQL,如下所示:

minime2@CEBERUS:~/Projects/skunkworks$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dc176901052a        df:pg               "docker-entrypoint..."   About an hour ago   Up About an hour    5432/tcp            vigilant_agnesi

minime2@CEBERUS:~/Projects/skunkworks$ CONTAINER_ID=dc176901052a
minime2@CEBERUS:~/Projects/skunkworks$ IP=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' $CONTAINER_ID)

minime2@CEBERUS:~/Projects/skunkworks$ echo $IP
172.17.0.2


minime2@CEBERUS:~/Projects/skunkworks$ docker exec -it vigilant_agnesi psql -U postgres -W cookiebox
Passwod for user postgres:
psql (9.6.5)
Type "help" for help

cookiebox#

现在尝试与Python连接:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> conn = psycopg2.connect("dbname='cookiebox' user='postgres' host='172.17.0.2' password='nunyabiznes'")                                     Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/minime2/Projects/skunkworks/archivers/env/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
        Is the server running on host "172.17.0.2" and accepting
        TCP/IP connections on port 5432?

>>> 

任何人都可以解释为什么我无法使用 Python 连接到 PostgreSQL - 即使我使用在命令行上启用成功连接的相同参数/参数(使用

docker exec
?)。

[[其他信息]]

按照@Itvhillo的建议,我尝试使用桌面应用程序连接到PG服务。我使用以下命令运行 docker 服务:

docker run -i -p 5432:5432 --name $CONTAINER_NAME $DOCKER_IMAGE

我正在使用 Db Visualizer 连接到数据库,并且我已将主机名设置为“localhost”。我可以成功 ping 端口,但当我尝试连接到数据库时仍然收到错误消息(可能与权限相关的错误):

An error occurred while establishing the connection:

Long Message:
The connection attempt failed.

Details:
   Type: org.postgresql.util.PSQLException
   SQL State: 08001

顺便说一句,这是 PG 服务实例输出的尾部:

PostgreSQL init process complete; ready for start up.

LOG:  could not bind IPv6 socket: Cannot assign requested address
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG:  database system was shut down at 2018-01-30 16:21:59 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

[[附加信息2]]

这是我的 Dockerfile 的尾部:

# modified target locations (checked by login onto Docker container)
# show hba_file;
# show config_file;

#################################################################################
# From here: https://docs.docker.com/engine/examples/postgresql_service/
# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all  all    0.0.0.0/0  md5" >> /var/lib/postgresql/data/pg_hba.conf

# And add ``listen_addresses`` to ``/var/lib/postgresql/data/postgresql.conf``
RUN echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf
#################################################################################


EXPOSE 5432

# Add VOLUMEs to allow backup of config, logs and databases
VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql", "/usr/lib/postgresql/"]
python postgresql docker psycopg2
5个回答
20
投票

如果你正在跑步

$ docker run -i -p 5432:5432 --name $CONTAINER_NAME $DOCKER_IMAGE

然后您应该能够从主机连接到

localhost:5432
。检查端口 5432 是否有监听的最简单方法是使用 netcat。如果成功,您应该得到:

$ nc -zv localhost 5432 
Connection to localhost 5432 port [tcp/postgresql] succeeded!

在这种情况下,您应该能够使用以下方式进行连接:

>>> psycopg2.connect("dbname='cookiebox' user='postgres' host='localhost' password='nunyabiznes'") 

另一方面,如果你得到类似的信息:

$ nc -zv localhost 5432 
nc: connect to localhost port 5432 (tcp) failed: Connection refused

那么这意味着 PostgreSQL 没有监听,因此您的 Dockerfile 中出现了问题,您需要在 Dockerfile 上发布更多详细信息来诊断它。


3
投票

由于某种原因,PostgreSQL 似乎无法绑定套接字来监听 TCP 连接。不过,它仍然侦听容器内的默认 UNIX 套接字,因此您可以通过

docker exec -it $CONTAINER_NAME psql
连接到它。


0
投票

在postgresql.conf文件中更改 将listen_addresses = 'localhost'改为listen_addresses = '*' 然后尝试通过 psql 连接

psql -h docker-ip -u 用户名-w


0
投票

尝试隔离问题:在默认端口上运行干净的 postgres 实例,不带任何扩展:

docker run  -d --name tst-postgres-01 -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres:9.6

并尝试连接到它。如果可以的话,那么您必须相应地检查您的 Dockerfile:只需从其中删除所有内容,然后一一添加新内容。否则,如果无法连接,则尝试在其他端口上运行它:

docker run  -d --name tst-postgres-01 -p 45432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres:9.6

并尝试连接。如果这次有效,则说明您主机上的网络配置有问题,不知何故 5432 端口被阻止或被其他应用程序使用。


0
投票

我有两个 docker 容器,一个用于 jupyter-notebook,一个用于 Postgres 服务器。 即使我打开了端口 5432,我也无法使用笔记本上的 psycopg2 访问它。 我尝试了 Localhost 和 127.0.0.1,但它对我不起作用。

解决方案是创建一个单独的 docker 网络并将两个镜像添加到其中。

docker network create con
docker network connect con postgres-db-1
docker network connect con jupyter-lab-cuda

要获取 postgres 服务器的正确 IP,请运行:

docker network inspect con

搜索类似这样的内容:

"Name": "postgres-db-1",
                "EndpointID": "c470f620cb02ef19d6c1213df5c86e5e02531206a0a9c4759cd5cccd0665a5e5",
                "MacAddress": ".....",
                "IPv4Address": "172.28.0.2/16",

那么您应该使用 172.28.0.2:5432 连接到您的服务器。

© www.soinside.com 2019 - 2024. All rights reserved.