postgresql - 使用Docker-compose,如何通过容器和主机中的相同端口访问容器数据库

标签 postgresql docker docker-compose docker-networking

我正在为PostgreSQL运行一个docker-compose容器。容器中的postgresql数据库在标准端口5432上运行,并且我正在将该端口发布到主机上的端口5444(因为正在使用主机的postgresql默认端口)。

我在主机和容器中使用相同的配置(一个.env文件,该文件为cli命令和整个应用程序提供配置设置)。不幸的是,无论我选择哪个端口,一个系统都将无法访问。例如,我不能运行:

[k@host]$ pgsql -p 5444 # Connects

在主机中,并且仍在容器内进行工作:
[k@db-container]$ pgsql -p 5444 # Errors in container

容器的postgresql-server在5432上运行:
[k@db-container]$ pgsql -p 5432 # Connects successfully in container

端口通过docker-compose.yml通过以下方式发布:
-端口:
-“5444:5432”

所以目前我不知道如何简单地通过docker-compose.yml在每个地方配置相同的端口! expose命令公开端口,但不允许重新映射,ports转发主机<->容器,但不重新映射内部端口。我曾考虑过在postgresql容器配置中重新映射postgresql默认端口,但是完全重新配置postgresql似乎很重要,这可以通过docker-compose在每个docker-compose up上完成。

如何重新映射容器内的端口,以便可以在主机和容器中的任何地方使用端口5444?

最佳答案

标准的PostgreSQL客户端库支持several environment variables,它告诉服务器服务器在哪里。与可以使用$PGHOST配置主机的方式相同,可以使用$PGPORT配置端口。

在Docker Compose上下文中,设置这些设置应该很简单:

version: '3'
services:
  postgres:
    image: postgres:11
    ports: ['5444:5432']
    volumes: ['./postgres:/var/lib/postgresql/data']
  myapp:
    build: .
    ports: ['8888:8888']
    env:
      PGHOST: postgres
      # default PGPORT=5432 will work fine

同样,如果要在主机上的开发环境中运行应用程序,则可以设置
PGHOST=localhost PGPORT=5444 ./myapp

关于postgresql - 使用Docker-compose,如何通过容器和主机中的相同端口访问容器数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54117629/

相关文章:

python - 执行时和使用奇点构建镜像时的 python 版本不同,相同的官方 python docker 镜像

ruby-on-rails - 如何查找*所有*匹配类别的项目

postgresql - 我如何知道 Postgresql 表空间中有什么?

c# - C# Npgsql 传递的复合类型数组作为存储过程输入

docker - asp net core docker serilog配置

docker - 无法 ping 使用 docker-compose 创建的 docker 容器

PostgreSQL 可以使用 HASH 排除约束来实现唯一性吗?

docker - Filebeat 不会将日志发送到 logstash

docker - 命令 '/bin/sh -c apk add .... 返回非零代码 : 6

php - 重启 Docker 容器之谜