You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从异机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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:15:03