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

时间:2019-01-09 20:14:11

标签: 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服务器在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?

2 个答案:

答案 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。如果您要几个实例-显然您必须以某种方式使它们有所不同。