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

Using Docker-compose, how to access the container database via the same port in container and in host

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

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

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

在宿主机中并且仍然在容器中工作:

[k@db-container]$ pgsql -p 5444 # Errors in container

容器的 postgresql-server 运行ning on 5432:

[k@db-container]$ pgsql -p 5432 # Connects successfully in container

并且端口是通过 docker-compose.yml 发布的: - 端口: - “5444:5432”

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

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

您不能在 主机 上使用同一个端口。

如果实例具有不同个IP地址,没有什么能阻止您运行多个实例。

psql -p 5444

默认为 psql --host=127.0.0.1 -p 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