Postgres 9.1的Docker容器不公开端口5432到主机

我试图使用Docker容器来运行PostgreSQL服务器,并从我的主机连接它。

我的configuration是:

  • 主机:Mac OS X 10.10.5
  • Docker 1.10.1

我已经这样做了:

第1步 :为永久postgres数据创build一个卷

docker volume create --name postgres_data 

第2步 :启动postgres实例

更新 :如注释中所build议的,我在运行容器时指定了端口映射

 docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1 

第3步 :通过这样连接到Docker实例:

 docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

但是我想通过以下方式连接到该实例:

 psql -h localhost -p 5432 -U postgres 

就像我在主机上本地安装Postgres一样。

问题是5432端口没有暴露 。 所以,我不能连接它:

sudo lsof -i -P | grep -i "listen" sudo lsof -i -P | grep -i "listen" – >没有端口5432打开

更新2 :甚至是陌生人。 我也做了这个:

停止Docker。 然后, 在我的主机上运行一个普通的PostgreSQL 9.4.4实例(这里没有涉及到docker,只是postgres在我的Mac OS X主机上运行,​​监听端口5432)。 一切正常:

 sudo lsof -i -P | grep -i "postgres" postgres 14100 jorge 6u IPv4 0x780274158cebef01 0t0 TCP localhost:5432 (LISTEN) 

我可以连接到我的本地postgres实例没有任何问题(查看命令的输出:是为Mac OS X编译的postgres,我的主机):

 psql -h localhost -U postgres -c "select version()" version --------------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit (1 row) 

现在有趣的部分。 当主机PostgreSQL实例正在运行时,我再次启动Docker实例

开始! (而且不应该)。 我甚至可以连接使用docker运行…

 docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

如果我现在运行select版本(), 它显示postgres在我的docker实例内运行同时postgres运行在我的主机,docker,使用相同的5432端口 。 (看看输出,是为Debian编译的postgres,postgres里面的操作系统:9.1容器)

 postgres=# select version(); version ------------------------------------------------------------------------------------------------ PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit (1 row) 

为什么?

是否有意义? 我的最终目标是在另一个Docker容器中运行一个Django应用程序,并与我的Postgres实例连接 。 我怎么能这样做?

使用-p <host_port>:<container_port>运行带有正确端口映射的postgre图像-p <host_port>:<container_port>

 docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1 

您的docker主机是一个虚拟机,它拥有自己的IP地址。 您可以通过input以下命令来检测此IP地址:

 docker-machine ip 

答案是192.168.99.100

当使用-p 5432:5432交换机映射端口时,可以使用提到的IP地址,使用开发机器上的任何工具连接到postgres。