堆栈服务在特定接口上公开端口?

时间:2018-04-08 17:00:40

标签: docker docker-swarm docker-stack

我们在Digital Ocean上运行堆栈。为了提高安全性,docker swarm所有运行在Droplet上的专用网络(eth1)上。我们有一些管理服务,我们不希望在公共IP上公开,而是在私有IP上公开。

是否可以在特定接口上公开端口?或者可以创建另一个只暴露私有IP端口的入口网络?

我们现在的解决方法是,我们只是将这些服务作为普通容器运行,并在私有IP地址上公开端口。

2 个答案:

答案 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 开始你不能这样做:

  • docker swarm init/join 选项 --advertise-addr--listen-addr--data-path-addr 都与服务容器公开端口将绑定到哪些接口无关。
  • dockerd --ip 选项为以 run 或通过 docker-compose 启动的独立容器实现了所需的结果,不是 docker swarm。

在 Github 上有一个开放的 feature request issue。它自 2016 年以来一直开放,没有取得任何进展,但似乎受到了核心开发人员的大力反对。在该问题中讨论了一些骇人听闻的变通方法。另请参阅此 issue