【发布时间】:2016-06-26 00:23:45
【问题描述】:
我正在尝试使用 Docker 容器来运行 PostgreSQL 服务器,并从我的主机与其连接。
我的配置是:
- 主机:Mac OS X 10.10.5
- Docker 1.10.1
我已经这样做了:
第 1 步:为永久 postgres 数据创建一个卷
docker volume create --name postgres_data
第 2 步:启动 postgres 实例
更新:按照cmets的建议,我在运行容器时指定了端口映射
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 实例。我怎么能那样做?
【问题讨论】:
标签: postgresql docker