我正在尝试使用Docker容器运行PostgreSQL服务器,并从主机上与之连接。
我的配置是:
我已经做到了:
第1步 :为永久Postgres数据创建一个卷
docker volume create --name postgres_data
步骤2 :启动postgres实例
更新 :如注释中所建议,我在运行容器时指定了端口映射
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" ->没有打开端口5432
sudo lsof -i -P | grep -i "listen"
更新2 :甚至陌生人。我也这样做了:
停止Docker。然后, 在主机上 运行普通的PostgreSQL 9.4.4实例(此处不涉及docker,仅在Mac OS X主机中运行postgres,侦听端口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 run连接…
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 version(), 它将显示postgres在docker实例中运行,同时postgres使用相同的5432 port在docker之外的主机中运行 。(看看输出,是为Debian编译的postgres,是在postgres:9.1容器中的OS)
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实例连接 。我该怎么办?
那是2018年,我只是遇到了类似的问题。对我来说,解决方案似乎是使用docker道具的顺序。例如,这导致没有端口暴露在外;
docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432
虽然工作正常(按预期,图像暴露端口5432);
docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine