连接到Postgres Docker服务器 - 鉴定失败。

3
我已经设置了一个PostgreSQL容器,可以通过Adminer成功连接,但是当我尝试使用相同的凭据通过类似于DBeaver的方式连接时,出现身份验证错误。
我尝试在Dockerfile中暴露端口5432,并且可以看到在Windows上的docker中正确绑定了端口。我猜测由于是身份验证错误,问题不是服务器无法被看到,而是与用户名或密码有关?
Docker Compose文件和Dockerfile如下所示。
version: "3.7"

services:

  db:
    build: ./postgresql
    image: postgresql
    container_name: postgresql
    restart: always
    environment:
      - POSTGRES_DB=trac
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=1234
    ports:
      - 5432:5432

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  nginx:
    build: ./nginx
    image: nginx_db
    container_name: nginx_db
    restart: always
    ports:
      - "8004:8004"
      - "8005:8005"

Dockerfile:(Dockerfile稍后将用于复制SSL证书和密钥)

FROM postgres:9.6

EXPOSE 5432

想知道是否还有其他工具可以使其正常工作?

任何帮助都将不胜感激。

提前致谢。

更新:

尝试通过postgresql容器的IP地址172.28.0.3访问数据库,但连接超时,这表明PostgreSQL正在正确地侦听0.0.0.0:5432,但由于某种原因,用户和密码在Docker之外甚至从主机使用localhost也无法使用。


@jjanes 我该如何查看日志文件? - undefined
1
你甚至不需要Dockerfile来做这个。尝试移除build: ./postgresql并将image: postgresql替换为image: postgres:9.6 - undefined
@veben,Dockerfile在这里是为了将来能够对镜像进行扩展,因为我会添加SSL和自己的证书。问题是我无法在docker环境之外登录到数据库。 - undefined
2
如果没有您的自定义Dockerfile,您将能够确定问题是来自于您的Dockerfile还是其他地方(从而减少您需要查找问题的范围),我认为值得一试。 - undefined
1
所以你的问题不是容器本身,而是如何连接到它。这篇文章可能会对你有所帮助:https://medium.com/better-programming/connect-from-local-machine-to-postgresql-docker-container-f785f00461a7 你可能需要创建管理员数据库。 - undefined
显示剩余3条评论
3个回答

3
在Postgres数据文件夹中检查pg_hba.conf文件。 默认配置是只允许从本地登录(我猜Adminer正在进行),而不允许来自外部IP的登录。
为了允许通过密码验证从所有外部地址访问,请将以下行添加到您的pg_hba.conf文件中:
host    all             all            *            md5

如果您暴露端口(5432),则可以从外部连接到在Docker容器中运行的Postgres数据库。


我正在尝试使用DBeaver而不是Adminer通过localhost进行连接,但失败了,因为DBeaver位于docker之外。此刻我并不打算从外部IP进行连接。我已经更新了我的问题以反映这一点。 - undefined
是的,但如果你从docker容器外部连接,你不会通过localhost连接,而是至少通过docker桥接连接。在pg_hba.conf中打开postgres以接受来自外部的登录允许你这样做。 - undefined
好的,太棒了。我会试一试。你有没有想法如何在Dockerfile中更新或添加pg_hba.conf文件的那一行? - undefined
我假设您在更新docker实例时希望保留您的postgres数据。因此,我建议将postgres数据目录作为命名卷进行挂载。 由于pg_hba.conf文件位于数据目录中,您可以在首次设置后简单地对其进行编辑,并在升级时保持不变。否则,在镜像创建期间,您将不得不通过echo将该行输入到pg_hba.conf文件中。例如: RUN echo "host all all * md5" >> /var/lib/postgresql/data/pg_hba.conf - undefined
这个在Windows上使用Docker是可行的吗? - undefined

0

在更新了我的默认db_name之后,我还需要通过显式地暴露端口来更新docker-compose,就像OP所做的那样。

 db:
    image: postgres:13-alpine
    volumes:
      - dev-db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=devdb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=1234
    ports:
      - 5432:5432

但是关键在于重新启动服务器!DBeaver已连接到localhost:5432 :)


0
使用命令docker container inspect ${container_number},这将告诉你容器外部暴露的IP地址和端口。
命令'docker container ls'将帮助识别'容器编号'。

我可以通过检查工具看到,Postgres已经正确绑定到本地主机和端口5432,并且我可以通过Adminer正常访问,但是出现了身份验证错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接