介绍
当构建分布式系统以服务Docker容器时,通信和网络变得非常重要。 不可否认的是,面向服务的架构严重依赖组件之间的通信以便正确地运行。
在本指南中,我们将讨论用于将容器使用的网络模制成其所需状态的各种网络策略和工具。 一些情况可以利用Docker本地解决方案,而其他情况必须使用替代项目。
本地Docker网络实现
Docker本身提供了容器到容器和容器到主机通信所需的许多网络基础。
当Docker过程本身是提出来了,它配置一个新的名为虚拟桥接接口docker0
在主机系统上。 此接口允许Docker分配一个虚拟子网,以便在将运行的容器中使用。 该桥将用作容器中的网络和主机上的网络之间的主要接口点。
当容器由Docker启动时,将创建一个新的虚拟接口,并在网桥的子网范围内给定一个地址。 IP地址被挂接到容器的内部网络,提供所述容器的网络到一个路径docker0
在主机系统上的桥梁。 Docker自动配置iptables
规则来允许转发和NAT配置为伪装流量的影响docker0
运往外面的世界。
容器如何向消费者披露服务?
同一主机上的其他容器能够访问由其邻居提供的服务,而无需任何附加配置。 主机系统将简单地请求路由始发并去往docker0
接口到适当的位置。
容器可以将它们的端口暴露给主机,在那里它们可以接收从外部世界转发的流量。 暴露的端口可以映射到主机系统,通过选择特定端口或允许Docker选择随机,高,未使用的端口。 Docker采取任何转发规则和照顾iptables
配置在这些情况下,正确地路由数据包。
公开和出版港口之间的区别是什么?
在创建容器映像或运行容器时,您可以选择公开端口或发布端口。 两者之间的差异是显着的,但可能不是立即可辨别的。
暴露端口只意味着Docker会注意到该端口被容器使用。 这可以用于发现目的和链接。 例如,检查容器将提供有关暴露端口的信息。 当容器链接时,将在新容器中设置环境变量,指示在原始容器上暴露的端口。
默认情况下,主机系统和主机上的任何其他容器都可以访问容器,而不管端口是否被公开。 公开端口仅记录端口使用,并使该信息可用于自动映射和链接。
相比之下,发布端口将映射到主机接口,使其可用于外部世界。 容器端口可以映射到主机上的特定端口,或者Docker可以随机自动选择高的未使用端口。
什么是Docker链接?
Docker提供了一种称为“Docker链接”的机制,用于配置容器之间的通信。 如果新容器链接到现有容器,则通过环境变量为新容器提供现有容器的连接信息。
这提供了一种通过向新容器提供关于如何访问其伴侣的显式信息来建立两个容器之间的通信的简单方法。 环境变量根据由其他容器暴露的端口设置。 IP地址和其他信息将由Docker本身填写。
扩展Docker网络功能的项目
上面讨论的网络模型为网络建设提供了一个良好的起点。 在同一主机上的容器之间的通信是相当简单的,并且主机之间的通信可以通过常规公共网络发生,只要端口被正确地映射并且连接信息被给予另一方。
然而,出于安全或功能目的,许多应用需要特定的网络环境。 Docker的本地网络功能在这些情况下有些限制。 因此,已经创建了许多项目来扩展Docker网络生态系统。
创建覆盖网络以抽象基础拓扑
几个项目关注的一个功能改进是建立覆盖网络。 覆盖网络是建立在现有网络连接之上的虚拟网络。
建立覆盖网络允许您跨主机创建更可预测和统一的网络环境。 这可以简化容器之间的网络连接,无论它们在哪里运行。 单个虚拟网络可以跨越多个主机,或者可以向统一网络内的每个主机指定特定的子网。
覆盖网络的另一个用途是在结构计算集群的构造中。 在结构计算中,多个主机被抽象化并作为单个更强大的实体进行管理。 结构计算层的实现允许最终用户作为整体而不是单个主机来管理集群。 网络在这个聚类中占很大一部分。
高级网络配置
其他项目通过提供更大的灵活性扩展了Docker的网络功能。
Docker的默认网络配置是功能,但相当简单。 这些限制在处理跨主机网络时表现得最为完全,但也会在单个主机中阻碍更多定制的网络要求。
通过附加的“管道”能力提供附加功能。 这些项目不提供开箱即用的配置,但它们允许您手动挂接在一起并创建复杂的网络方案。 您可以获得的一些能力包括简单地在某些主机之间建立专用网络,配置网桥,vlans,自定义子网和网关。
还有一些工具和项目,虽然没有考虑到Docker,但是通常在Docker环境中使用以提供所需的功能。 特别地,成熟的专用网络和隧道技术经常用于在主机之间和在容器之间提供安全通信。
什么是一些常见的项目,以改善Docker网络?
有一些不同的项目专注于为Docker主机提供覆盖网络。 常见的是:
- 绒布 :由CoreOS团队开发,该项目最初是为每个主机系统拥有自己的共享网络的子网。 这是Google的kubernetes编排工具运行所必需的条件,但在其他情况下很有用。
- 编织 :编织创建每台主机连接在一起的虚拟网络。 这简化了应用程序路由,因为它给出每个容器插入单个网络交换机的外观。
在高级网络方面,以下项目旨在通过提供额外的管道来填补该空缺:
- 管道 :构造为权宜之计,直到Docker机联网变得更加先进,该项目允许任意先进的网络配置的简单的配置。
现有软件添加到Docker功能的一个相关示例是:
- TINC:TINC]是使用隧道和加密实现的轻质VPN软件。 Tinc是一个强大的解决方案,可以使私有网络对任何应用程序透明。
结论
通过容器化组件提供内部和外部服务是一个非常强大的模型,但网络注意事项成为优先事项。 虽然Docker提供了一些这种功能通过本地虚拟接口,子网,配置iptables
和NAT表管理,已创建等项目提供更高级的配置。
在接下来的指南中,我们将讨论的调度和协调工具如何在这基础上,提供集群容器管理功能。