如何从异机Docker容器连接另一台机器Docker内运行的远程数据库
实现跨机器Docker容器访问PostgreSQL的可行方案
方案1:端口映射+访问控制(无需SSH,最易实现)
无需借助SSH隧道,直接通过网络层权限控制实现安全访问:
- 首先修改db容器对应的
docker-compose.yml配置,给db服务添加端口映射规则,建议绑定宿主机的指定网卡IP(不要绑定0.0.0.0缩小攻击面),示例配置:
services: db: image: postgres:latest ports: # 替换为db宿主机的可被外部访问的IP,比如内网IP/公网固定IP - "192.168.3.10:5432:5432" # 其余原有配置保持不变
- 配置PostgreSQL访问规则:修改db容器挂载的
pg_hba.conf文件,添加仅允许server容器所在宿主机IP访问的规则,示例:
# 替换为server所在宿主机的IP,单IP指定/32掩码即可 host all all 192.168.3.20/32 scram-sha-256
- 配置db宿主机防火墙规则,仅放行server所在宿主机IP访问5432端口,以firewalld为例命令如下:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.3.20/32" port protocol="tcp" port="5432" accept' --permanent firewall-cmd --reload
- 跨机器部署的server容器直接使用
db宿主机IP:5432作为数据库连接地址即可。
方案2:跨节点Docker Overlay网络(适用于多机可组网场景)
如果两台机器可组建私有Docker网络,无需暴露端口到宿主机网络层,使用方式和同机部署完全一致:
- 两台机器加入同一个Docker Swarm集群,或者通过私有组网工具搭建跨节点的Docker网络,提前创建好全局可访问的overlay网络。
- 分别修改两台机器的
docker-compose.yml,给db和server服务都绑定这个外部overlay网络,示例配置:
networks: cross-host-net: external: true services: db: networks: - cross-host-net # 其余原有配置保持不变 --- # server所在机器的docker-compose.yml配置 networks: cross-host-net: external: true services: server: networks: - cross-host-net # 数据库连接地址直接填db服务名即可,和同机部署时一致
方案3:TCP隧道代理(适用于无法直接开放端口的场景)
如果db宿主机的5432端口无法对外放行,可使用frp等轻量级TCP隧道工具实现连接,无需开放SSH权限:
- 在db宿主机部署frp服务端,配置仅校验server端的连接密钥,不需要开放SSH登录权限。
- 在server所在宿主机部署frp客户端,将远端db容器的5432端口代理到本地的指定端口。
- server容器连接本地代理端口即可访问数据库。
通用安全建议
- 为server连接单独创建最小权限的PostgreSQL专用账号,禁止使用超级用户连接数据库。
- 所有对外暴露的服务必须配合IP白名单、强密码等身份校验机制,避免未授权访问。
内容的提问来源于stack exchange,提问作者László Marton
相关产品推荐
相关产品推荐

