在这方面花了很长时间,但没有突破。这是我的容器创建声明:
> 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
我错过了什么?
答案 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>
您还需要提供端口。