为什么Docker中的容器间通信是默认的?
我正在读一些关于Docker容器之间通信的文章。为什么Docker中的容器间通信是默认的?,docker,Docker,我正在读一些关于Docker容器之间通信的文章。--icc标志允许所有容器相互通信。默认情况下,该标志设置为true 据我所知,这会忽略任何EXPOSE/--EXPOSE声明。只有当--icc设置为false时,才会强制执行这些命令 那么,我们为什么要首先公开端口呢 或者为什么ICC没有设置为false作为默认值 你说得对。EXPOSE命令实际上只是元数据。它记录了开发人员可以在给定端口上联系容器的意图。就其本身而言,构建指令所做的全部工作就是将此元数据添加到映像中 正如您和larsks所指出
--icc
标志允许所有容器相互通信。默认情况下,该标志设置为true
据我所知,这会忽略任何EXPOSE
/--EXPOSE
声明。只有当--icc
设置为false时,才会强制执行这些命令
- 那么,我们为什么要首先公开端口呢李>
- 或者为什么ICC没有设置为false作为默认值
- 你说得对。EXPOSE命令实际上只是元数据。它记录了开发人员可以在给定端口上联系容器的意图。就其本身而言,构建指令所做的全部工作就是将此元数据添加到映像中
正如您和larsks所指出的,Docker在调用
-p
标志和链接时使用此信息
我假设Docker的立场是,当容器在自己的专用网络上运行时,在大多数情况下,它们会相互信任,最简单的方法是允许所有通信
如果禁用ICC,则必须设置
--iptables
标志(允许docker编辑iptables),并使用链接允许容器通信。我怀疑动态编辑iptables是Docker工程师想要尽可能长时间远离的事情。此外,由于链接的限制,某些设置变得不可能,例如,您不能有双向链接。EXPOSE语句还可用于(a)通过-p
自动发布端口和(b)链接容器时自动发现服务。EXPOSE命令实际上只是元数据,但根据我所说的,它在使用--link时使用,在--icc=false
时使用iptables强制执行。让我感到困惑。默认情况下,将ICC设置为false会让很多新用户感到困惑。我不确定。这些文档都是关于链接容器、公开端口和使用环境/主机名的。对我来说,情况正好相反:“为什么我能够ping另一个容器而不链接它?”这也是一个设计问题:使用--icc=false
可以强制封装。什么集装箱都有。@luebken是的,公平点。我已经稍微改写了我的答案。EXPOSE实际上只是一点元数据。当我意识到它所起的作用是如此之小时,我有点惊讶。@luebken只是补充了一点链接的限制。我怀疑这更重要;链接是一个很好的特性,但并不涵盖所有用例。而在过去,它们更脆弱,尤其是当容器重新启动时。