Postgres 9.1 的 Docker 容器未将端口 5432 暴露给主机

新手上路,请多包涵

我正在尝试使用 Docker 容器来运行 PostgreSQL 服务器,并从我的主机与其连接。

我的配置是:

  • 主机:Mac OS X 10.10.5
  • 码头工人 1.10.1

我已经这样做了:

第 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

更新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)

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

开始! (它不应该)。我什至可以使用 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 在我的主机中运行,在 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 实例。我怎么能那样做?

原文由 Jorge Arévalo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

现在是 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

原文由 MrGreg 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Ali Dehghani 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题