我正在为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服务器在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 up
上通过docker-compose来完成。
如何重新映射容器内的端口,以便可以在主机和容器中的任何地方使用端口5444?
答案 0 :(得分:1)
标准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
答案 1 :(得分:0)
您不能在主机上使用相同的端口。
如果它们具有不同的 IP地址,则没有什么可以阻止您运行多个实例。
psql -p 5444
默认为psql --host=127.0.0.1 -p 5444
。如果您要几个实例-显然您必须以某种方式使它们有所不同。