如何从本地Java环境访问远程主机Docker容器内的Postgres数据库
本地Java访问远程Docker部署Postgres数据库实现方案
步骤1:确认Docker容器端口映射配置
首先确保你docker-compose.yml中postgres服务已经配置了端口映射,将容器默认5432端口暴露到远程宿主机的端口:
services: postgres: image: postgres:latest ports: - "5432:5432" # 前者是宿主机端口,后者是容器内端口,宿主机端口可自定义修改 environment: POSTGRES_USER: your_username POSTGRES_PASSWORD: your_password POSTGRES_DB: your_database_name
你当前的配置参考:
配置修改后需要执行docker-compose up -d重启容器生效。
步骤2:放开远程主机访问限制
- 若远程主机是云服务器,需到对应云平台安全组规则中,放开上述配置的宿主机端口(如5432)的入站访问权限
- 若远程主机开启了系统防火墙,需添加端口放行规则:
以CentOS为例执行命令:firewall-cmd --add-port=5432/tcp --permanent && firewall-cmd --reload
以Ubuntu为例执行命令:ufw allow 5432/tcp
步骤3:确认Postgres访问权限配置
官方Postgres Docker镜像默认已配置listen_addresses = '*'且允许密码登录,如果你是自定义镜像,需要确认:
- 容器内
/var/lib/postgresql/data/pg_hba.conf中添加了允许外部IP访问的规则 postgresql.conf中listen_addresses配置为'*'
修改配置后需重启Postgres容器生效。
步骤4:本地Java项目配置访问
4.1 导入JDBC驱动
如果是Maven项目,在pom.xml中添加依赖:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> <!-- 可根据你的Postgres版本选择对应驱动版本 --> </dependency>
4.2 编写数据库连接代码
JDBC连接示例如下:
import java.sql.Connection; import java.sql.DriverManager; public class PostgresTest { public static void main(String[] args) { String url = "jdbc:postgresql://<远程主机公网IP>:<宿主机映射端口>/<你配置的数据库名>"; String user = "你配置的postgres用户名"; String password = "你配置的postgres密码"; try (Connection connection = DriverManager.getConnection(url, user, password)) { System.out.println("数据库连接成功"); } catch (Exception e) { e.printStackTrace(); } } }
如果是Spring Boot项目,直接在application.yml中添加配置即可:
spring: datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://<远程主机公网IP>:<宿主机映射端口>/<你配置的数据库名> username: 你配置的postgres用户名 password: 你配置的postgres密码
常见排错
- 先在本地执行
telnet <远程主机IP> <映射端口>检查端口是否连通,不通则排查端口映射、防火墙、安全组配置 - 端口连通但提示权限错误,检查Postgres的账号密码、pg_hba.conf配置是否正确
内容的提问来源于stack exchange,提问作者João Miguens
相关产品推荐
相关产品推荐

