📜  docker postgre 数据库连接拒绝 (1)

📅  最后修改于: 2023-12-03 15:00:29.107000             🧑  作者: Mango

Docker Postgre 数据库连接拒绝

在使用 Docker 部署 Postgre 数据库时,有时会遇到连接被拒绝的问题。这个问题可能会导致应用程序无法正常运行,因此需要及时解决。

原因分析

Postgre 数据库默认使用本地套接字作为连接方式,但是在 Docker 容器中,套接字无法跨容器通信,因此需要通过 TCP/IP 连接。如果未正确设置数据库配置,应用程序连接数据库时可能会被拒绝。

解决方案
1. 检查数据库连接地址和端口号

首先要确保应用程序连接的地址和端口号正确。在 Docker 容器中使用 docker ps 命令查看容器的端口映射,确认容器内部端口号和外部映射的端口号是否匹配。

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS                     NAMES
4cce8584c7e9   postgres "docker-entrypoint.s…"   5 hours ago    Up 5 hours    0.0.0.0:5432->5432/tcp    db

这里可以看到,数据库容器内部使用的端口号是 5432,而外部映射的端口号也是 5432,因此应用程序连接的地址应该是 localhost:5432

2. 设置数据库监听地址

postgresql.conf 配置文件中,需要将 listen_addresses 参数设置为 '*',表示允许任何 IP 地址访问数据库。如果只希望特定 IP 地址访问,可以设置为具体的 IP 地址。这个配置文件通常位于 /etc/postgresql/<version>/main/ 目录下。

# /etc/postgresql/13/main/postgresql.conf

# listen_addresses = 'localhost'        # what IP address(es) to listen on;
listen_addresses = '*'                # allow all IP addresses to connect

修改完成后,重启 Postgre 服务,使配置生效。

$ service postgresql restart
3. 授权访问数据库

pg_hba.conf 配置文件中,需要增加一条允许特定 IP 地址访问数据库的规则。这个配置文件通常也位于 /etc/postgresql/<version>/main/ 目录下。

# /etc/postgresql/13/main/pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
# host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5   # 添加这一行,允许任意 IP 地址连接
# IPv6 local connections:
# host    all             all             ::1/128                 md5

这里增加了一行 host all all 0.0.0.0/0 md5,表示允许任意 IP 地址连接数据库,并通过 md5 加密方式进行身份验证。如果只允许特定 IP 地址连接,可以将 0.0.0.0/0 改成具体的 IP 地址。

4. 验证数据库连接

修改完配置文件后,重新启动 Postgre 服务。使用以下命令连接数据库,验证连接是否成功。

$ psql -h localhost -p 5432 -U postgres -d mydb

如果提示输入密码,说明连接成功。也可以使用 GUI 工具,如 PgAdmin、DBeaver 等,连接数据库验证。如果连接失败,可以查看日志文件 /var/log/postgresql/postgresql-<version>-main.log,查找错误信息。

总结

在 Docker 中部署 Postgre 数据库时,要特别注意连接被拒绝的问题。需要设置正确的地址和端口号,允许任意 IP 地址连接数据库,并通过加密方式进行身份验证。通过以上方法可以轻松解决连接被拒绝的问题。