我们在Digital Ocean上运行堆栈。为了提高安全性,docker swarm所有运行在Droplet上的专用网络(eth1)上。我们有一些管理服务,我们不希望在公共IP上公开,而是在私有IP上公开。
是否可以在特定接口上公开端口?或者可以创建另一个只暴露私有IP端口的入口网络?
我们现在的解决方法是,我们只是将这些服务作为普通容器运行,并在私有IP地址上公开端口。
答案 0 :(得分:2)
使用覆盖网络驱动程序(使用入口网络)时,只有一个入口,在--data-path-addr
期间使用docker swarm init/join
定义。您可以使用专用网络进行Swarm"控制平面" --advertise-addr
但这是你唯一拥有的控件。
如果您需要控制对特定登录组/ IP的访问权限,那么我建议将代理放在他们面前并控制这种方式。 Here's some nginx info on that。您可以在Docker Flow Proxy或Traefik中进行设置。
您可以做的另一件事是设置服务约束,其中一组服务器用于公共访问,另一组正在侦听私有IP并具有特定节点标签,因此您可以使用仅部署到私人/公共服务器。
答案 1 :(得分:0)
答案是不,从 docker v20 开始你不能这样做:
--advertise-addr
、--listen-addr
、--data-path-addr
都与服务容器公开端口将绑定到哪些接口无关。--ip
选项为以 run
或通过 docker-compose
启动的独立容器实现了所需的结果,不是 docker swarm。在 Github 上有一个开放的 feature request issue。它自 2016 年以来一直开放,没有取得任何进展,但似乎受到了核心开发人员的大力反对。在该问题中讨论了一些骇人听闻的变通方法。另请参阅此 issue。