Docker连接到PostgreSQL失败了主机

时间:2018-01-10 15:31:11

标签: postgresql docker

在这方面花了很长时间,但没有突破。这是我的容器创建声明:

> docker create --name aasaan_db_dev -e POSTGRES_USER=aasaan -e
> POSTGRES_PASSWORD=aasaan_admin --expose 5432 postgres:9.4.0
> 
> > deepakkt@deepakkt-ubuntu:~$ docker ps
> 
> CONTAINER ID        IMAGE               COMMAND                 
> CREATED             STATUS              PORTS               NAMES
> 15b21deb19a0        postgres:9.4.0      "/docker-entrypoin..."   About
> an hour ago   Up About an hour    5432/tcp            aasaan_db_dev

以下作品:

> deepakkt@deepakkt-ubuntu:~$ docker exec -it aasaan_db_dev psql -U
> aasaan psql (9.4.0) Type "help" for help.
> 
> aasaan=#

但是,来自主机(同样来自pgAdmin的错误)

> deepakkt@deepakkt-ubuntu:~$ psql -h 127.0.0.1 -U aasaan 
Password for user aasaan:  
psql: FATAL:  password authentication failed for user
> "aasaan" FATAL:  password authentication failed for user "aasaan"

容器内 pg_hba.conf 的内容:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                trust
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust

host all all 0.0.0.0/0 md5

我错过了什么?

3 个答案:

答案 0 :(得分:2)

需要将容器端口映射到主机端口。

请查看以下docker文档:

  

EXPOSE指令实际上并不发布端口。它   作为构建人之间的一种文档   图像和运行容器的人,关于哪些端口   打算发表。在运行时实际发布端口   容器,在docker run上使用-p标志来发布和映射一个或   更多端口,或-P标志,以发布所有公开的端口并映射它们   到高阶港口。

来源:docker docs

答案 1 :(得分:1)

docker ps正在为您的端口部分显示5432/tcp。 这意味着在postgres容器上打开了端口5432。 (这是默认情况下,因为它在postgres的Dockerfile中公开,所以你不需要--expose命令。)

您的容器名称为aasaan_db_dev。部署在同一桥接网络中的其他容器可以使用aasaan_db_dev:5432访问您的容器。

但是您的容器没有将其端口映射到外部,这意味着您无法从桥接网络外部访问容器。 (例如,不是来自eth0)。

要映射您的端口,请使用以下命令:

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

在这种情况下,-p选项会在您主机5432的容器中映射5432。现在,您应该能够从主机网络连接到容器(例如localhost)。

答案 2 :(得分:0)

您不应该使用127.0.0.1,因为它将引用您的localhost。但实际上,它正在一个容器上运行。

你应该使用

psql -h <imagename> -U <username> 

您还需要提供端口。