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

Stack service expose port on specific interface?

我们在 Digital Ocean 上拥有堆栈 运行ning。为了提高安全性,docker 将私有网络 (eth1) 上的所有 运行 都聚集在 Droplets 上。我们有一些管理服务不想暴露在 public IP 上,而是暴露在私有 IP 上。

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

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

当使用覆盖网络驱动程序(使用入口网络)时,只有一个入口,在 docker swarm init/join 期间用 --data-path-addr 定义。您可以为 Swarm 使用专用网络 "control plane" --advertise-addr 但这是您唯一的控制权。

如果您需要控制对 logins/IP 的特定组的访问,那么我建议在他们前面放置一个代理并以这种方式进行控制。 Here's some nginx info on that。您可以在 Docker Flow Proxy 或 Traefik 中进行设置。

您可以做的另一件事是设置服务约束,其中一组服务器用于 public 访问,另一组服务器侦听私有 IP 并具有特定的节点标签,因此您可以部署具有仅部署约束的服务到 private/public 个服务器。

答案是,从docker v20:

开始你不能这样做
  • docker swarm init/join 选项 --advertise-addr--listen-addr--data-path-addr 与服务容器公开端口将绑定到哪些接口无关。
  • dockerd --ip 选项为以 run 或通过 docker-compose 启动的独立容器实现了预期的结果,并且 not docker群.

有空档feature request issue for it on Github. It's been open since 2016 with no progress but a lot of push back from core devs seemingly. There are a couple of hackish work arounds discussed in that issue. Also see this issue