ThingsBoard——Docker重启失败,报错Connection to localhost:5432 refused的解决方法

本文探讨了在使用Docker运行自定义Thingsboard规则节点时,频繁重启失败的问题,原因在于PostgreSQL数据库未在容器停止时正确关闭。通过分析,提供了安全关闭数据库的方法,包括手动停止、强制杀死进程等,以确保容器重启时的顺利运行。

一、问题

最近在写自定义规则节点,因为还没编译好thingsboard源代码,用的是docker搭建起来的环境。写好的规则节点后,要打包好扔到docker里,再重启docker。发现经常重启失败,报错的日志也都是这样:

2022-03-05 08:53:23,164 [main] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:303)
...

2022-03-05 08:53:25,187 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springfra
Spring Boot 连接 PostgreSQL 出现 `[08001] Connection to localhost:5432 refused` 错误,通常意味着应用程序无法连接到本地 PostgreSQL 服务器。以下是一些可能的解决办法: #### 1. 检查 PostgreSQL 服务是否启动 要保证 PostgreSQL 服务正在运行。在不同的操作系统上,启动方式有所不同: - **Linux(以 Ubuntu 为例)**: ```bash sudo systemctl start postgresql ``` - **Windows**:可以在服务管理器中找到 `PostgreSQL` 服务,然后启动它。 #### 2. 检查 PostgreSQL 监听地址和端口 确认 PostgreSQL 正在监听 `localhost:5432`。打开 `postgresql.conf` 文件,一般位于 `/etc/postgresql/<version>/main/postgresql.conf`,确保以下配置: ```plaintext listen_addresses = 'localhost' port = 5432 ``` 修改后,重启 PostgreSQL 服务: ```bash sudo systemctl restart postgresql ``` #### 3. 检查防火墙设置 防火墙可能会阻止应用程序连接到 PostgreSQL 服务。需要开放 5432 端口: - **Linux(以 Ubuntu 为例)**: ```bash sudo ufw allow 5432 ``` #### 4. 检查 Docker 部署情况 如果 PostgreSQL 是通过 Docker 部署的,可能会存在网络问题。参考引用[1],若同一台机子上 Docker 部署了多个项目和数据库,Spring Boot 项目连接数据库时,由于 Docker 容器是相互独立的环境,使用 `localhost` 可能无法正确连接。可以使用 `host.docker.internal` 替换 `localhost`,示例配置如下: ```properties spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/test-demo ``` 若数据库启动时创建了网络,则使用创建的网络 IP 替换 `localhost`,并在 Docker 启动数据库时添加 `--network` 和 `--ip` 参数。 #### 5. 检查 `postmaster.pid` 文件 若 PostgreSQL 容器停止时未正确关闭,可能会在 `data/db` 目录下留下一个陈旧的 `postmaster.pid` 文件,导致下次启动时 `pg_ctl` 尝试与不存在的守护进程通信,最终无法启动数据库服务器。参考引用[3],在启动容器之前删除该文件可以解决问题。 #### 6. 检查 Spring Boot 配置 确保 `application.properties` 或 `application.yml` 文件中的数据库连接配置正确: ```properties spring.datasource.url=jdbc:postgresql://localhost:5432/test-demo spring.datasource.username=postgres spring.datasource.password=123456 spring.datasource.driver-class-name=org.postgresql.Driver ``` ### 实现数据增删改查接口请求 在解决连接问题后,可以按照之前的步骤创建实体类、Repository 接口和 Controller 层来实现数据增删改查接口请求。 #### 实体类 ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } ``` #### Repository 接口 ```java import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { } ``` #### Controller 层 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/users") public class UserController { @Autowired private UserRepository userRepository; @GetMapping public List<User> getAllUsers() { return userRepository.findAll(); } @PostMapping public User addUser(@RequestBody User user) { return userRepository.save(user); } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userRepository.findById(id).orElse(null); } @PutMapping("/{id}") public User updateUser(@PathVariable Long id, @RequestBody User user) { user.setId(id); return userRepository.save(user); } @DeleteMapping("/{id}") public void deleteUser(@PathVariable Long id) { userRepository.deleteById(id); } } ```
<think>嗯,用户遇到了PostgreSQL连接被拒绝的问题,具体是连接到localhost:5432时被拒绝,提示postmaster不接受TCP/IP连接。我需要根据提供的引用信息来找出可能的原因和解决方案。 首先,引用[1]提到检查PostgreSQL状态时显示没有服务器在运行。所以第一步应该是确认PostgreSQL服务是否正在运行。用户可能需要启动服务,或者查看日志排查启动失败的原因。 接着,引用[3]提到Docker关闭时可能没有正确释放PostgreSQL进程,导致重启失败。这可能意味着如果用户使用Docker,需要确保容器完全停止后再启动,或者检查残留的进程占用了端口。 然后是配置问题。PostgreSQL默认可能只监听本地socket,不监听TCP/IP。需要检查postgresql.conf文件中的listen_addresses是否为'*',以及端口是否正确。此外,pg_hba.conf文件中的客户端认证设置是否正确,允许来自所需IP范围的连接。 还有防火墙或端口限制的可能性。即使PostgreSQL配置正确,如果防火墙阻止了5432端口,连接也会被拒绝。需要检查iptables或firewalld设置,确保端口开放。 另外,用户可能使用了错误的连接地址或端口,比如连接到localhost而实际服务运行在另一个IP或端口上,或者存在多个PostgreSQL实例导致端口冲突。 综合这些可能性,解决步骤应该包括检查服务状态、调整配置文件、处理防火墙、检查连接参数等。同时,需要根据具体情况,比如是否使用Docker,来针对性处理。</think>### 分步解决方案 #### 1. 检查PostgreSQL服务状态 ```bash # 检查服务是否运行 systemctl status postgresql # 或使用pg_ctl命令(需指定数据目录) pg_ctl -D /usr/local/var/postgres status ``` - 若显示`no server running`,需要启动服务: ```bash systemctl start postgresql # 或通过pg_ctl启动 pg_ctl -D /usr/local/var/postgres start ``` #### 2. 确认TCP/IP配置 修改配置文件`postgresql.conf`(路径通常为`/etc/postgresql/[版本]/main/postgresql.conf`): ```bash # 允许监听所有IP地址 listen_addresses = '*' # 确认端口设置 port = 5432 ``` 修改后重启服务: ```bash systemctl restart postgresql ``` #### 3. 调整客户端认证规则 修改`pg_hba.conf`文件(与postgresql.conf同目录): ```bash # 允许所有IPv4/IPv6客户端通过密码连接 host all all 0.0.0.0/0 md5 host all all ::/0 md5 ``` 重启服务使配置生效[^3]。 #### 4. 检查端口占用与防火墙 ```bash # 查看5432端口是否被占用 netstat -tuln | grep 5432 # 开放防火墙端口(CentOS/Fedora) firewall-cmd --permanent --add-port=5432/tcp firewall-cmd --reload ``` #### 5. Docker环境特殊处理 若使用D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值