我尝试使用Docker容器来运行PostgreSQL服务器,并从我的主机连接它。
我的配置是:
- 主机:Mac OS X 10.10.5
- Docker 1.10.1
我做过这个:
第一步:创建永久postgres数据卷
docker volume create --name postgres_data
第二步:启动postgres示例
UPDATE:按照注解中的建议,我在运行容器时指定了端口Map
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
第三步:连接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端口。(看看输出,postgres是为Debian编译的,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示例。我怎么能这么做
9条答案
按热度按时间fafcakar1#
现在是2018年,我遇到了类似的问题。对我来说,解决方案似乎是docker的props顺序。例如,这导致没有端口暴露;
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
yzuktlbb2#
使用
-p <host_port>:<container_port>
使用正确的 Port Mapping 运行postgre镜像:3df52oht3#
我能够使用容器IP或主机IP连接,除了localhost(127.0.0.1)。
要获取容器ID,请运行
查找所需的容器ID并运行
端口必须暴露。
下面是一个docker-compose.yml的例子,它启动了两个容器postgres和adminer,这是一个数据库管理工具,你可以用它来连接到postgres:
ctehm74n4#
你的docker主机是一个虚拟机,它有自己的IP地址。您可以通过输入以下命令来检测此IP地址:
答案类似于192.168.99.100
当您使用-p 5432:5432开关Map端口后,您将能够使用所提到的IP地址从开发机器上使用任何工具连接到postgres。
uoifb46i5#
我也遇到过类似的问题。我的问题只是0.0.0.0没有Map到localhost,所以我只需要添加到psql
这是假设
产出
jhiyze9q6#
其他的答案是有效的,但不能解释为什么有效。
给定命令:
localhost
实际上是一个特殊的值,它告诉psql寻找一个unix套接字连接,而不是通过TCP。我们不能使用unix sockets连接到docker服务。像这样更改命令可以修复它,通过强制TCP:
这将工作,只要你
docker run ... -p 5432:5432 ...
。指定docker-machine ip
返回的IP也会强制使用TCP,因此也可以使用TCP。tsm1rwdh7#
我在使用Lubuntu的VMWare虚拟机中也遇到了类似的问题。VM已暂停,然后重新启动。PostgreSQL Docker容器被正确Map并监听localhost:5432,但我总是得到:
重新启动VM解决了我的问题。
iyr7buue8#
尝试安装postgresql
或更改端口主机Heree(mac)
提示:安装pgadmin4
jslywgbw9#
希望实现此代码以供容器化数据库使用的人以及希望使用图形界面的人也可以使用此