我正在try 使用Docker容器运行PostgreSQL server,并从主机连接它.

我的配置是:

  • 主机:Mac OS X 10.10.5
  • Docker 1.10.1

我做到了:

Step 1:创建永久postgres数据的卷

docker volume create --name postgres_data

Step 2:启动postgres实例

UPDATE:正如 comments 中所建议的,我在运行容器时指定了端口映射

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

Step 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一样.

问题是port 5432 is not exposed.所以,我无法与之联系:

sudo lsof -i -P | grep -i "listen" --> no port 5432 open

UPDATE 2:甚至是陌生人.我也这样做过:

停下Docker.然后,运行一个普通的PostgreSQL 9.4.4实例in my host machine(这里没有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实例(查看命令的输出:postgres是否为我的主机Mac OS X编译):

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实例,while the host PostgreSQL instance is running.

开始了!(而且不应该).我甚至可以用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(),it shows postgres running inside my docker instance at the same time postgres is running in my host, out of docker, using the same 5432 port.(看看输出,postgres是为Debian编译的吗?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)

为什么?

这有意义吗?我的最终目标是to run a Django app in another Docker container and connect with my Postgres instance.我怎么能这么做?

推荐答案

2018年,我也遇到了类似的问题.对我来说,解决办法似乎是向docker订购props .e、 g.这导致没有expose 任何端口;

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

Postgresql相关问答推荐

到第二天的Postgres计时器

将列类型从文本[]更改为jsonb[]

将XML解析从T-SQL迁移到Postgres时出现问题

Postgres查询按月和年分组的总计数

在 Postgres 中,部分索引比普通索引需要更多的时间和成本来执行

如何通过 DirectFunctionCall 发送 NULL 参数?

Power BI + Postgres:只读用户

错误:分区表的唯一约束必须包括所有分区列

Postgres 低估了导致错误查询计划的行数

Postgresql:创建默认表空间的视图和使用?

PostgreSQL ,从 2 个表中 Select ,但仅从表 2 中 Select 最新的元素

MAC OS X 上的 Postgres 权限被拒绝

我应该同时指定 INDEX 和 UNIQUE INDEX 吗?

如何在psql中退出查询结果查看器?

使用 current_setting() 判断值

我怎样才能知道 Postgresql 表空间中有什么?

用于更改 postgresql 用户密码的 bash 脚本

Python PostgreSQL 模块.哪个最好?

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

在 PGAdmin 中搜索所有功能的文本