无法从 Python 连接到 Docker Postgresql 实例
Failure to connect to Docker Postgresql instance from Python
我正在使用 Docker 到 "containerize" 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 - 即使我使用相同的 arguments/parameters 在命令行启用成功连接(使用 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]]
这是我的 Docker 文件的结尾:
# 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/"]
PostgreSQL 似乎出于某种原因无法绑定套接字来侦听 TCP 连接。不过,它仍然监听容器内的默认 UNIX 套接字,因此您可以通过 docker exec -it $CONTAINER_NAME psql
.
连接到它
在postgresql.conf文件中更改
listen_addresses = 'localhost' 到 listen_addresses = '*'
然后尝试通过 psql
连接
psql -h docker-ip -u username -w
尝试隔离问题:运行 清除默认端口上没有任何扩展的 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 端口被阻止或被其他应用程序使用。
如果你是 运行
$ 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 中有问题,您需要 post 有关您的 Dockerfile 的更多详细信息来诊断它。
我正在使用 Docker 到 "containerize" 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 - 即使我使用相同的 arguments/parameters 在命令行启用成功连接(使用 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]]
这是我的 Docker 文件的结尾:
# 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/"]
PostgreSQL 似乎出于某种原因无法绑定套接字来侦听 TCP 连接。不过,它仍然监听容器内的默认 UNIX 套接字,因此您可以通过 docker exec -it $CONTAINER_NAME psql
.
在postgresql.conf文件中更改 listen_addresses = 'localhost' 到 listen_addresses = '*' 然后尝试通过 psql
连接psql -h docker-ip -u username -w
尝试隔离问题:运行 清除默认端口上没有任何扩展的 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 端口被阻止或被其他应用程序使用。
如果你是 运行
$ 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 中有问题,您需要 post 有关您的 Dockerfile 的更多详细信息来诊断它。