将PostgreSQL容器化 - psql连接被拒绝

32

我正在尝试使用Docker并希望将Postgres容器化。

我按照官方示例进行操作,但无法使用psql连接到正在运行的镜像。

我创建了一个包含示例内容的Dockerfile。我从Dockerfile构建了一个镜像,并为其分配了名称。然后我运行了PostgreSQL服务器容器(在前台)。

~/test » docker run --rm -P --name pg_test eg_postgresql                                                                                                       
2014-10-10 06:12:43 UTC LOG:  database system was interrupted; last known up at 2014-10-10 06:12:29 UTC
2014-10-10 06:12:43 UTC LOG:  database system was not properly shut down; automatic recovery in progress
2014-10-10 06:12:43 UTC LOG:  redo starts at 0/1782F68
2014-10-10 06:12:43 UTC LOG:  record with zero length at 0/1782FA8
2014-10-10 06:12:43 UTC LOG:  redo done at 0/1782F68
2014-10-10 06:12:43 UTC LOG:  last completed transaction was at log time 2014-10-10 06:12:29.2487+00
2014-10-10 06:12:43 UTC LOG:  database system is ready to accept connections
2014-10-10 06:12:43 UTC LOG:  autovacuum launcher started

然后我打开另一个终端来查找端口:

~/test » docker ps                                                                                                                                             
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                     NAMES
aaedb0479139        eg_postgresql:latest   "/usr/lib/postgresql   3 days ago          Up 41 seconds       0.0.0.0:49154->5432/tcp   pg_test

所以我可以使用psql连接到实例。但是我不能...

~/test » psql -h localhost -p 49154 -d docker -U docker --password                                                                                             
Password for user docker:
psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 49154?
could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 49154?
could not connect to server: Connection refused
    Is the server running on host "localhost" (fe80::1) and accepting
    TCP/IP connections on port 49154?

非常感谢您的帮助。


它是否使用容器链接工作? - cthulhu
1
是的,它可以。但我想要能够从我的主机系统连接。 - Kummo
“netstat | grep 49154”是什么意思? - cthulhu
如果您使用5433:5432,它不会暴露5433端口,并且您将收到连接被拒绝的错误。一旦您将其更改为"5433:5432",它就可以正常工作。已经使用官方的postgres:13.2镜像进行了测试(同样适用于13版本)。 - Juan
5个回答

51

2
这对我有用。(注意:我也在Docker上运行pgadmin) - rkw
1
对我也起作用了,上次我进行相同的设置时并没有需要它...我不确定为什么。然而,它让我很高兴它能够工作! - daevski
对我来说有效,使用WSL在Windows上运行Docker。 - Abercrombie

21

如果您在docker run命令中添加--publish选项

docker run --rm -P --publish 127.0.0.1:5432:5432 --name pg_test eg_postgresql 
当您运行Docker文件时,以下内容将起作用(请注意端口现在为5432)。
psql -h localhost -p 5432 -d docker -U docker --password

1
仍然发生,看起来发布端口并不能解决问题。 - Kummo
你是否有防火墙阻止你连接到该端口? - C R

15

要获取正在运行的容器的IP地址,您可以执行以下操作:

docker inspect pg_test | grep IPAddress

然后使用它来代替“localhost”。

其中pg_test是从容器名称接收的。

docker ps

或者为了更干净的输出,可以使用docker inspect <容器名称> | jq '.[].NetworkSettings.IPAddress' - hertg

13

在我的 Mac 上运行此操作对我有效:

 $ boot2docker ip
 The VM's Host only interface IP address is: 192.168.59.103

然后沿着这些线连接:

 $ psql -h 192.168.59.103 -p 49159 -d docker -U docker --password

虽然这一切都不是理想的,但https://docs.docker.com/installation/mac/的说明表明,如果你想直接从Mac连接,这是正确的解决方案。


这可能是网络配置问题吗?我知道将网络设置为公开容器以供本地主机使用并不容易。我的情况是在运行CentOS7的VirtualBox客户端中。我需要在虚拟盒子网络配置中添加第二个接口,并使用仅主机模式将主机和客户端加入第二个子网。然后,我使用Squid在两个网络之间进行反向代理。也许有一种使用路由的方法,但这种方法似乎很好用。 - Gerry Gleason

1

有人在这里回答了这个问题。

总结:仅发布容器的端口是不够的,因为在OS X上,Docker容器运行在虚拟机上。要检索虚拟机的“真实”地址,您应该使用管理Docker守护程序和容器的工具。

我建议使用docker-machine

逻辑与wf的答案非常相似,但使用的是docker-machine而不是boot2docker。

1- / 检索虚拟机的名称

docker-machine ls

2-/ 通过虚拟机名称(例如默认值)检索虚拟机的IP地址

docker-machine ip default

3-/ 在需要指定主机值的任何地方使用此值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接