无法从VM访问docker容器中的postgresql

时间:2016-04-29 16:28:34

标签: postgresql docker vagrant virtual-machine

我有一个通过bash配置设置了vagrant的虚拟机。

我尝试在启动时安装一组应用程序和工具来编写VM,其中一些需要PostgreSQL数据库。我删除了配置阶段,只包括必要的部分:

install.sh:

function installPostgresql() {
  docker pull postgres:9.4
  docker run --name dbcontainer -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -e POSTGRES_DB=dbname -e POSTGTES_HOST=localhost -d postgres
}

...
installPostgresql

这使用为postgresql创建的默认广泛使用的docker镜像。我从中央存储库中取出后启动它。

出于某种原因,我无法访问我的VM内部正在运行的postgres服务,但如果我在正在运行的docker上执行/ bin / bash并且在VM内部的docker中使用psql,我 CAN 连接它

内部虚拟机:

vagrant@debian-jessie:~$ psql -h localhost -p 5432 -U postgres -W
Password for user postgres: 
psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
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 5432?

VM内部的docker:

root@1d0b5be83f6e:/# psql -h localhost -p 5432 -U postgres -W
Password for user postgres: 
psql (9.5.2)
Type "help" for help.

postgres=#

的pg_hba.conf:

local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
host    all             all             0.0.0.0/0               md5

为什么它在VM内部的docker中工作,而不是从VM中“仅”?

1 个答案:

答案 0 :(得分:2)

听起来好像这是一个端口暴露问题。默认情况下,Docker容器不会将任何端口发布到主机(在本例中为VM)。但是,如果链接容器,那些容器可以与暴露的端口进行交互(例如,在相关的Dockerfile中描述)。

尝试在-p命令中添加docker run选项,将PostgreSQL端口发布到主机:

docker run --name dbcontainer -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -e POSTGRES_DB=dbname -e POSTGTES_HOST=localhost -d -p 5432:5432 postgres

您可以找到有关此in the documentation的更多信息。