使用新的 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.json
false:
# cat daemon.json
{
"iptables": false
}
然后就像在网络之间路由流量时一样配置网络。
这也意味着您需要设置端口转发(或 HTTP 代理等)才能从外部访问容器,并且您必须定义自己的 docker 网络(docker network
)。
我的答案这里也可能有帮助。