如何在不将端口暴露到互联网的情况下访问 Docker Swarm 上的数据库?

如何在不将端口暴露到互联网的情况下访问 Docker Swarm 上的数据库?

我真的很难想出一个简短而描述性的标题......让我解释一下:

在经典 Docker(无 Swarm 模式)中,我设置了系统,使 PostgreSQL 数据库只向本地主机公开其主端口(5432)。这样,我就可以通过 SSH 进入我的 Web 服务器,将端口 5432 隧道连接到本地主机,并在开发机器上使用 pgAdmin,就像数据库在我的机器本地运行一样。使用起来很舒服,而且(据我所知)非常安全。

但是,我目前正在将其迁移到 Swarm 模式。据我所知(也可以谷歌搜索到),在 Swarm 模式下,不可能只向本地主机公开服务端口。这也有点道理,因为服务可以自发移动到不同的节点,而你真的不想关心哪个服务在哪里运行。

在我的例子中,数据库服务将被限制在单个节点上,因为我使用标准本地卷进行数据库持久化(至少目前如此)。所以我知道数据库在哪台机器上运行。

现在,这些服务可以很好地相互通信,而无需暴露任何端口,因为它们都在同一个覆盖网络上。但是,当我想以交互方式检查(或修改)我的数据库时,例如使用 pgAdmin,我只能看到不令人满意的解决方案:

  • 将端口 5432(及其所有可能被利用的漏洞)暴露给互联网
  • 在与 postgresql 相同的覆盖网络内启动 pgAdmin 服务,并将其暴露给互联网(再次:可黑客入侵)
  • SSH 进入数据库节点,执行进入容器并从命令行执行所有操作(呃......)

有没有更好的方法来处理这个问题?我遗漏了什么吗?

顺便说一句,我认为以下几点与本次讨论无关:

  • 我知道您不应该手动修改实时数据库。这仅用于测试和诊断。
  • 我知道最好使用一些高级卷管理工具,如 REX-Ray 或其他工具,但目前这对我来说有点过头了。请不要试图说服我放弃本地卷,只是因为它“更好”。
  • 我知道我可以不使用 Swarm 模式来处理数据库。我仍然想学习如何在 Swarm 模式下正确处理这个问题,因为用例(安全访问 Swarm 服务)对我来说似乎并不奇怪。我还想使用一些 Swarm 独有的功能,比如机密和配置。

相关内容