当前位置: 首页 > 面试题库 >

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

欧阳智志
2023-03-14
问题内容

我正在尝试使用Docker容器运行PostgreSQL服务器,并从主机上与之连接。

我的配置是:

  • 主机:Mac OS X 10.10.5
  • Docker 1.10.1

我已经做到了:

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

docker volume create --name postgres_data

步骤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

步骤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)

现在有趣的部分。 在主机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'

如果我现在运行select version(), 它将显示postgres在docker实例中运行,同时postgres使用相同的5432
port在docker之外的主机中运行
。(看看输出,是为Debian编译的postgres,是在postgres:9.1容器中的OS)

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实例连接 。我该怎么办?


问题答案:

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



 类似资料:
  • 问题内容: 在我的工作中,我与docker一起工作,而该选项的工作方式就像将docker容器端口转发到机器的超级按钮一样。这使我可以通过示例添加使用某些端口的艰苦任务: 在9001端口为我的覆盖率报告提供帮助 我的应用程序的本地部署版本在端口9000中提供 手表实时重新加载端口35729 对于单元测试运行器,请使用9876端口 当我开始在Mac中使用Docker时,我遇到的第一个问题是:该选项不再

  • 本文向大家介绍Docker动态给容器Container暴露端口操作,包括了Docker动态给容器Container暴露端口操作的使用技巧和注意事项,需要的朋友参考一下 查看Container的IP地址 docker inspect <container name or id>| grep IPAddress 查看Container的映射的端口 用iptables查看容器映射情况 iptables

  • 我知道在linux主机系统上使用pulse audio是可能的,但是< code>paprefs是为Linux而不是mac构建的。

  • 主机:Mac OS X 10.10.5 Docker 1.10.1 我做过这样的事: 步骤1:为永久postgres数据创建卷 -->没有打开端口5432 更新2:更陌生。我也这样做过: 阻止Docker。然后,在我的主机中运行一个普通的PostgreSQL 9.4.4实例(这里不涉及docker,只在Mac OS X主机中运行postgres,监听端口5432)。一切正常: 为什么? 有道理吗?

  • EXPOSE 声明端口 格式为 EXPOSE <端口1> [<端口2>...]。 EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,

  • 我正在尝试用Docker和Selenium Grid建立一个自动化测试平台。在下图中,你可以看到我使用的结构。最上面是运行在计算引擎上的ubuntu服务器。左边是一个运行ubuntu 14.04的docker容器。该容器使用Google App Engine在localhost:8080上运行我们的项目。右边是Selenium集线器,有两个节点在端口4444上运行。 Docker和Selenium