从主机连接到 PSQL dockerized DB

Posted

技术标签:

【中文标题】从主机连接到 PSQL dockerized DB【英文标题】:Connecting to a PSQL dockerized DB from host 【发布时间】:2020-10-14 10:14:11 【问题描述】:

我在 Docker 容器中配置 PostgreSQL 数据库时遇到了一些问题。我的主要问题是我想直接从我的主机访问它。

我的容器配置如下:

version: '3'

services:
  db:
    image: postgres:10.4
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./var/docker/db/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf

volumes:
  pgdata:

我的pg_hba.conf 文件是默认文件,额外添加了两行:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

# IPv4 local connections:

########### LINE ADDED ###########
host    all             all             0.0.0.0/0               md5

host    all             all             127.0.0.1/32            trust

# IPv6 local connections:

########### LINE ADDED ###########
host    all             all             ::/0                    md5

host    all             all             ::1/128                 trust

# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

当我尝试连接到我的容器时,我遇到了以下错误:

psql --host=127.0.0.1

psql: could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 5432?

我首先检查了我的 Docker 容器上的端口是否正确重定向:

docker ps

IMAGE               COMMAND                         STATUS              PORTS                    NAMES
postgres:10.4       "docker-entrypoint.s…"          Up 6 seconds        0.0.0.0:5432->5432/tcp   db_1

然后,我检查了 PSQL 是否正确运行,在容器中执行以下操作:

netstat -tlnp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.11:42293        0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::5432                 :::*                    LISTEN      -                   

据我了解:

服务器侦听所有主机在端口 5432 上发出的所有请求。 容器将主机端口 5432 上的所有流量转发到容器端口 5432, PSQL 要求所有非本地主机的密码(我在 pg_hba.conf 中添加的两行)

我错过了什么?我可以检查其他任何东西来调试我的问题吗?

【问题讨论】:

你能用 telnet 建立 TCP 连接吗?运行telnet localhost 5432,看看它是否连接。 看起来我可以:尝试 127.0.0.1... 已连接到本地主机。转义字符是'^]'。 好吧,这是一个奇怪的案例......这不是网络问题,因为您可以建立 TCP 连接。也许有另一个应用程序正在侦听该端口?运行ss -tulpen | grep 5432 并看到它有users:(("dockerd" 我有一个 "* : 5432" 在 TCP 上监听,与 * : * 对等体。不确定是否理解该过程:“ino:959086 sk:1c v6only:0 ”。正常吗? 您需要使用sudo 运行它,抱歉忘了提及 【参考方案1】:

嗯...这是令人尴尬的开发时刻之一...在与@toydarian 进一步调查之后(非常感谢您的时间!),我终于注意到这是由于我很久以前设置的别名:

别名 psql="docker run -ti --rm postgres:10.4 psql"

它解释了为什么它不起作用。让我们看看好的一面:我学到了很多关于 PSQL 配置的知识! :)

【讨论】:

哇哦!这解释了它...... :D 很高兴你明白了! :)

以上是关于从主机连接到 PSQL dockerized DB的主要内容,如果未能解决你的问题,请参考以下文章

无法从 golang 连接到 docker postgres 容器

如何将安装在主机服务器上的 phpmyadmin 连接到正在运行的 docker 容器内的 maria db? [关闭]

Docker compose api无法连接到主机MongoDB数据库

docker从容器连接到主机隧道

从 docker 容器连接到主机 mongodb

无法从我的 Docker 容器内部连接到主机的 localhost