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

lndjwyie  于 2023-06-21  发布在  Docker
关注(0)|答案(9)|浏览(139)

我尝试使用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示例。我怎么能这么做

fafcakar

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

yzuktlbb

yzuktlbb2#

使用-p <host_port>:<container_port>使用正确的 Port Mapping 运行postgre镜像:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1
3df52oht

3df52oht3#

我能够使用容器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
ctehm74n

ctehm74n4#

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

docker-machine ip

答案类似于192.168.99.100
当您使用-p 5432:5432开关Map端口后,您将能够使用所提到的IP地址从开发机器上使用任何工具连接到postgres。

uoifb46i

uoifb46i5#

我也遇到过类似的问题。我的问题只是0.0.0.0没有Map到localhost,所以我只需要添加到psql

psql --host=0.0.0.0

这是假设

docker port <container name>

产出

5432/tcp -> 0.0.0.0:5432
jhiyze9q

jhiyze9q6#

其他的答案是有效的,但不能解释为什么有效。
给定命令:

psql -h localhost -p 5432:5432 -U postgres

localhost实际上是一个特殊的值,它告诉psql寻找一个unix套接字连接,而不是通过TCP。我们不能使用unix sockets连接到docker服务。
像这样更改命令可以修复它,通过强制TCP:

psql -h 127.0.0.1 -p 5432:5432 -U postgres

这将工作,只要你docker run ... -p 5432:5432 ...。指定docker-machine ip返回的IP也会强制使用TCP,因此也可以使用TCP。

tsm1rwdh

tsm1rwdh7#

我在使用Lubuntu的VMWare虚拟机中也遇到了类似的问题。VM已暂停,然后重新启动。PostgreSQL Docker容器被正确Map并监听localhost:5432,但我总是得到:

psql: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

重新启动VM解决了我的问题。

iyr7buue

iyr7buue8#

尝试安装postgresql

docker run --name postgres -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

或更改端口主机Heree(mac)

docker run --name postgres -d -p 5436:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

提示:安装pgadmin4

docker run -p 5050:80  -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

jslywgbw

jslywgbw9#

希望实现此代码以供容器化数据库使用的人以及希望使用图形界面的人也可以使用此

  • docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=root -d postgres
  • Docker PS
  • 码头检查
  • result:“IPAddress”:“172.17.0.2“,
  • docker run -p 5050:80 -e“PGADMIN_DEFAULT_EMAIL=name@example.com“-e“PGADMIN_DEFAULT_PASSWORD=admin”-d dpage/pgadmin4
  • http://localhost:5432/

相关问题