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

Jor*_*alo 30 postgresql docker

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

我的配置是:

  • 主机:Mac OS X 10.10.5
  • Docker 1.10.1

我这样做了:

第1步:为永久性postgres数据创建一个卷

docker volume create --name postgres_data
Run Code Online (Sandbox Code Playgroud)

第2步:启动postgres实例

更新:正如评论中所建议的那样,我在运行容器时指定了端口映射

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
Run Code Online (Sandbox Code Playgroud)

第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'
Run Code Online (Sandbox Code Playgroud)

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

psql -h localhost -p 5432 -U postgres
Run Code Online (Sandbox Code Playgroud)

就像我在我的主机上本地安装了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)
Run Code Online (Sandbox Code Playgroud)

我可以毫无问题地连接我的本地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)
Run Code Online (Sandbox Code Playgroud)

现在有趣的部分.当主机PostgreSQL实例运行时,我再次启动我的Docker实例.

开始!(它不应该).我甚至可以使用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'
Run Code Online (Sandbox Code Playgroud)

如果我现在运行select version(),它会显示在我的docker实例中运行的postgres,同时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)
Run Code Online (Sandbox Code Playgroud)

为什么?

是否有意义?我的最终目标是在另一个Docker容器中运行Django应用程序并与我的Postgres实例连接.我怎么能这样做?

小智 46

这是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

  • 我的理解是,在图像名称被定向到容器中运行的命令之后传递的args,并且在图像名称之前传递的args被传递给Docker (6认同)

Ali*_*ani 10

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

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1
Run Code Online (Sandbox Code Playgroud)

  • 你应该能够使用普通的`psql` ..你试过`-h 127.0.0.1 -p 5432`吗? (2认同)

小智 8

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

docker-machine ip
Run Code Online (Sandbox Code Playgroud)

答案将是192.168.99.100

使用-p 5432:5432交换机映射端口后,您将能够使用所提到的IP地址通过dev机器上的任何工具连接到postgres.


Rom*_*n_K 8

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

获取容器 ID 运行

docker ps
Run Code Online (Sandbox Code Playgroud)

查找所需的容器 ID 并运行

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>
Run Code Online (Sandbox Code Playgroud)

端口必须暴露。

这是 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
Run Code Online (Sandbox Code Playgroud)


小智 7

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

psql --host=0.0.0.0
Run Code Online (Sandbox Code Playgroud)

这是假设

docker port <container name>
Run Code Online (Sandbox Code Playgroud)

产出

5432/tcp -> 0.0.0.0:5432
Run Code Online (Sandbox Code Playgroud)