繁体   English   中英

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

[英]Docker container for Postgres 9.1 not exposing port 5432 to host

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

我的配置是:

  • 主机:Mac OS X 10.10.5<\/li>
  • 码头工人 1.10.1<\/li><\/ul>

    我已经这样做了:

    第 1 步<\/strong>:为永久 postgres 数据创建一个卷

    第 2 步<\/strong>:启动 postgres 实例

    更新<\/strong>:正如评论中所建议的,我在运行容器时指定了端口映射

    第 3 步<\/strong>:通过执行以下操作连接到 Docker 实例:

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

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

    问题是端口 5432 没有暴露<\/strong>。 所以,我无法连接它:

    sudo lsof -i -P | grep -i "listen"<\/code> --> 没有打开 5432 端口

    更新2<\/strong> :甚至更陌生。 我也这样做了:

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

    我可以毫无问题地连接我的本地 postgres 实例(查看命令的输出:是为我的主机 Mac OS X 编译的 postgres):

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

    开始! (它不应该)。 我什至可以使用 docker run 连接...

    如果我现在运行 select version(),它会显示 postgres 在我的 docker 实例中运行,同时 postgres 在我的主机中运行,在 docker 之外,使用相同的 5432 端口<\/strong>。  (看看输出,是为 Debian 编译的 postgres,postgres:9.1 容器内的操作系统)

    为什么?

    是否有意义? 我的最终目标是在另一个 Docker 容器中运行 Django 应用程序并连接到我的 Postgres 实例<\/strong>。 我怎么能那样做?

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

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

docker-machine ip

答案将类似于192.168.99.100

当您使用 -p 5432:5432 开关映射端口后,您将能够使用提到的 IP 地址使用开发机器上的任何工具连接到 postgres。

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

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

我能够使用容器 IP 或主机 IP 进行连接,除了 localhost (127.0.0.1)。

获取容器 ID 运行

docker ps

查找所需的容器 ID 并运行

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>

端口必须暴露。

这是 docker-compose.yml 的示例,它启动了两个容器 postgres 和 adminer,这是您可以用来连接到 postgres 的数据库管理工具:

version: '3'
services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
  postgres:
    image: postgres:11.4-alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

我有一个类似的问题。 我的问题只是 0.0.0.0 没有映射到 localhost 所以我只需要添加到 psql

psql --host=0.0.0.0

这是假设

docker port <container name>

产出

5432/tcp -> 0.0.0.0:5432

我在使用 Lubuntu 的 VMWare 虚拟机中工作时遇到了类似的问题。 VM 已暂停,然后重新启动。 PostgreSQL Docker 容器已正确映射并在 localhost:5432 上侦听,但我总是得到:

psql: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

在我的情况下,重新启动 VM 解决了问题。

其他答案有效,但没有解释它们为什么有效。

鉴于命令:

psql -h localhost -p 5432:5432 -U postgres

localhost实际上是一个特殊值,它告诉 psql 查找 unix 套接字连接,而不是通过 TCP。 我们不能使用 unix 套接字连接到 docker 服务。

像这样更改命令可以修复它,通过强制 TCP:

psql -h 127.0.0.1 -p 5432:5432 -U postgres

只要您docker run ... -p 5432:5432 ...这就会起作用。 指定docker-machine ip返回的docker-machine ip也会强制使用 TCP,因此这也有效。

试试这个来安装 postgresql

 docker run --name postgres -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM