如何通过在 postgres 的 pg_hba.conf 文件中指定 docker-compose 主机名来允许连接?

lig*_*ite 6 database postgresql networking docker docker-compose

我试图通过在服务器pg_hba.conf文件中指定客户端容器的主机名来允许从一个 Docker 容器连接到 postgres 容器。Postgres 的文档表明可以指定主机名,而不是 IP 地址。由于我使用 Docker Compose 来启动两个容器,因此它们应该可以使用 Docker Compose 的 DNS 通过容器名称相互访问。出于安全原因,我不想打开所有 IP 地址,当我最终为其他容器添加访问权限时,在 pg_hba.conf 文件中指定容器名称而不是为每个容器分配静态 IP 地址会容易得多其中。但是,当我尝试执行此操作时,它失败并显示如下消息:

psql: FATAL: no pg_hba.conf entry for host "192.168.208.3", user "postgres", database "postgres", SSL off

这是我正在尝试做的最小可重复示例:

我使用以下 Docker Compose 文件:

version: '3'
services:
  postgresdb:
    image: postgres:9.4
    container_name: postgres-server
    ports:
      - "5432:5432"
    volumes:
      - "postgres-data:/var/lib/postgresql/data"
  postgres-client:
    image: postgres:9.4
    container_name: postgres-client
    depends_on:
      - postgres-server

volumes:
  postgres-data:
Run Code Online (Sandbox Code Playgroud)

运行后docker-compose up,我 exec 进入服务器容器并将pg_hba.conf文件修改为/var/lib/postgresql/data如下所示:

host all postgres postgres-client trust
Run Code Online (Sandbox Code Playgroud)

然后我重新启动 postgres 服务器(docker-compose downthen docker-compose up)并pg_hba.conf从已安装的卷中加载修改后的内容。

我执行到客户端容器并尝试连接到 postgres 服务器:

docker exec -it postgres-client /bin/bash
psql -U postgres -h postgres-server postgres
Run Code Online (Sandbox Code Playgroud)

这是我收到如下错误的地方:

psql: FATAL:  no pg_hba.conf entry for host "192.168.208.3", user "postgres", database "postgres", SSL off
Run Code Online (Sandbox Code Playgroud)

我似乎无法在网上找到任何显示如何使其工作的内容。我找到了一些例子,它们只是打开所有或一系列 IP 地址,但没有一个例子可以使用主机名。以下是一些相关的问题和信息:

关于如何使用 Docker Compose 以我期望的方式使其工作的任何想法?

Jan*_*Dev 9

您需要在 中添加客户端容器的完全限定主机名pg_hba.conf

host all postgres postgres-client.<network_name> trust
Run Code Online (Sandbox Code Playgroud)

例如:

host all postgres postgres-client.postgreshostresolution_default trust
Run Code Online (Sandbox Code Playgroud)

如果未定义网络,network_name则为<project_name>_default。默认情况下project_name是 docker-compose.yml 所在的文件夹。

要获取网络名称,您还可以调用

docker inspect postgres-client | grep Networks -A1
Run Code Online (Sandbox Code Playgroud)

或者

docker network ls
Run Code Online (Sandbox Code Playgroud)

获取当前在 docker 主机上定义的所有 docker 网络的列表

  • 好的!这有效。```您的容器名称.您的网络名称``` (3认同)