Dockerizing PostgreSQL - psql连接被拒绝

时间:2014-10-13 15:08:42

标签: postgresql docker psql

我正在玩Docker,我想Dockerize一个Postgres容器。

我跟随官方example,但我无法连接到使用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?

感谢任何帮助。

4 个答案:

答案 0 :(得分:8)

在我的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连接,这是正确的解决方案。

答案 1 :(得分:6)

如果将--publish选项添加到docker run命令

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

答案 2 :(得分:2)

对我来说,解决方案只是在您的连接字符串中使用host.docker.internal而不是localhost

https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/225

答案 3 :(得分:1)

有人回答了这个问题here

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

我建议使用docker-machine

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

1- /检索虚拟机的名称

docker-machine ls

2- /通过使用虚拟机的名称(例如,默认)来检索其IP地址

docker-machine ip default

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