📅  最后修改于: 2023-12-03 15:00:29.107000             🧑  作者: Mango
在使用 Docker 部署 Postgre 数据库时,有时会遇到连接被拒绝的问题。这个问题可能会导致应用程序无法正常运行,因此需要及时解决。
Postgre 数据库默认使用本地套接字作为连接方式,但是在 Docker 容器中,套接字无法跨容器通信,因此需要通过 TCP/IP 连接。如果未正确设置数据库配置,应用程序连接数据库时可能会被拒绝。
首先要确保应用程序连接的地址和端口号正确。在 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
。
在 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
在 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 地址。
修改完配置文件后,重新启动 Postgre 服务。使用以下命令连接数据库,验证连接是否成功。
$ psql -h localhost -p 5432 -U postgres -d mydb
如果提示输入密码,说明连接成功。也可以使用 GUI 工具,如 PgAdmin、DBeaver 等,连接数据库验证。如果连接失败,可以查看日志文件 /var/log/postgresql/postgresql-<version>-main.log
,查找错误信息。
在 Docker 中部署 Postgre 数据库时,要特别注意连接被拒绝的问题。需要设置正确的地址和端口号,允许任意 IP 地址连接数据库,并通过加密方式进行身份验证。通过以上方法可以轻松解决连接被拒绝的问题。