Docker如何明确允许任何两个容器通信,默认禁止

Docker如何明确允许任何两个容器通信,默认禁止

使用新的 docker 自定义网络,如果您想默认禁止容器间通信并明确定义任何可以通信的容器对,则需要创建最多 2^N 个网络(其中 N = 容器数量)并将两个容器连接到每个网络。这样做有什么缺点吗?

此外,如果我只允许从webServerContainer到 的出站连接dbContainer,但不允许从dbContainer到 的入站连接webServerContainer,有什么办法吗?

似乎使用icc=false和旧版--link功能允许这样的事情,但该功能被标记为已弃用。

例如:

  • 我有 1 个数据库容器
  • 我有 N 个无状态容器需要读取/写入数据库
  • 我希望允许 N 个无状态容器中的每一个与数据库容器通信,但阻止任何一对 N 无状态容器之间的连接
  • 如果我把所有 N+1 个容器放在同一个用户定义database-access网络中,它们中的任何一对都可以相互通信,这不是我想要的
  • 此外,理想情况下,我希望我的 N 个无状态容器能够发起与我的数据库容器的连接,但我不希望我的数据库容器能够以另一种方式发起连接

截至 Docker 17.12,有人对实现此目标的最佳方法有什么建议吗?

答案1

我的回答可能不是最适合docker的方式,但我希望仍然有帮助。

我更喜欢手动操作。Docker 操纵 iptables 来实现访问规则和容器间通信。我个人不喜欢这种方式(出于几个原因;iptables 的状态通常会变得一团糟,尤其是其他软件也操纵 iptables 时)。所以,我将其设置"iptables": false/etc/docker/daemon.jsonfalse:

# cat daemon.json 
{
  "iptables": false
}

然后就像在网络之间路由流量时一样配置网络。

这也意味着您需要设置端口转发(或 HTTP 代理等)才能从外部访问容器,并且您必须定义自己的 docker 网络(docker network)。

我的答案这里也可能有帮助。

相关内容