[英]Can only connect pgadmin to postgres docker container on port 5432, but not any other port?
[英]Docker container for Postgres 9.1 not exposing port 5432 to host
我正在尝试使用 Docker 容器来运行 PostgreSQL 服务器,并从我的主机与其连接。
我的配置是:
我已经这样做了:
第 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.