介绍
在构建分布式系统来服务 Docker 容器时,通信和网络变得非常重要。
在本指南中,我们将讨论用于将集装箱所使用的网络塑造成所需状态的各种网络策略和工具。
Native Docker 网络应用程序
Docker本身为集装箱到集装箱和集装箱到主机通信提供了许多必要的网络基础。
当 Docker 进程本身出现时,它会在主机系统上配置一个名为docker0
的新虚拟桥接接口,该接口允许 Docker 将虚拟子网分配到它将运行的集装箱中使用,该桥接口将作为集装箱内网络和主机上的网络之间的主要接口点。
当一个集装箱由Docker启动时,会创建一个新的虚拟接口,并在桥梁的子网范围内提供一个地址. IP 地址被连接到集装箱的内部网络,为集装箱的网络提供了一个通往主机系统上的docker0
桥梁的路径。
集装箱如何向消费者提供服务?
同一主机上的其他集装箱可以访问其邻居提供的服务,而无需任何额外配置。
集装箱可以将其端口暴露给主机,在那里他们可以接收来自外部世界的流量。暴露的端口可以通过选择特定端口或允许Docker选择随机,高,未使用的端口来对主机系统进行映射。
曝光和发布端口有什么区别?
当创建集装箱图像或运行集装箱时,您可以选择暴露端口或发布端口。
暴露一个端口仅意味着Docker会注意到该端口被集装箱使用,然后可以用于发现和链接,例如,检查一个集装箱会为您提供有关暴露的端口的信息。
默认情况下,集装箱可以访问主机系统和主机上的任何其他集装箱,无论端口是否暴露。
相比之下,发布一个端口会将其绘制到主机界面,使其可用于外部世界. 容器端口可以将其绘制到主机上的特定端口,或者Docker 可以随机选择一个高,未使用的端口。
什么是Docker Links?
Docker 提供了一个叫做Docker 链接
的机制,用于配置容器之间的通信. 如果新容器连接到现有容器,则新容器将通过环境变量为现有容器提供连接信息。
这样可以通过给新容器提供如何访问其伴侣的明确信息来建立两个容器之间的通信,环境变量根据另一个容器暴露的端口设置。
扩展 Docker 网络能力的项目
上面讨论的网络模型为网络建设提供了良好的起点,同一主机上的集装箱之间的通信是相当简单的,并且主机之间的通信可以在正常的公共网络上进行,只要端口被正确地图和连接信息交给对方。
然而,许多应用程序为了安全或功能而需要特定网络环境。Docker 的本地网络功能在这些情况下有些有限。
创建覆盖网络以抽象底层 Topology
几个项目专注于的一个功能性改进是建立覆盖网络,覆盖网络是建立在现有网络连接上的一种虚拟网络。
建立覆盖网络允许您在主机之间创建更可预测和统一的网络环境,这可以简化集装箱之间的网络,无论它们在哪里运行。
重叠网络的另一个用途在于构建布料计算集群。在布料计算中,多个主机被抽象化并作为一个更强大的实体进行管理。布料计算层的实现使最终用户能够管理整个集群而不是单个主机。
先进的网络配置
其他项目通过提供更多的灵活性来扩大Docker的网络能力。
Docker 的默认网络配置是功能性的,但相当简单,这些限制在处理跨主机网络时最充分地表达自己,但也可能阻碍单个主机内更定制的网络需求。
通过额外的管道
功能提供额外的功能. 这些项目不提供盒子外的配置,但它们允许您手动连接零件并创建复杂的网络场景。
还有一些工具和项目,虽然没有在Docker中开发,但在Docker环境中经常被用来提供所需的功能,特别是成熟的私人网络和隧道技术经常被用来提供主机之间和容器之间安全的通信。
哪些是改善Docker网络的常见项目?
有几个不同的项目专注于为Docker主机提供覆盖网络。
- flannel:由CoreOS团队开发,这个项目最初是为了为每个主机系统提供共享网络的子网而开发的,这是Google的cubernetes编排工具运作的必要条件,但在其他情况下也是有用的。
在先进的网络方面,下列项目旨在通过提供额外的供水来填补这个空缺:
- pipework:作为一个停止差距的措施,直到Docker本地网络变得更加先进,这个项目允许轻松配置任意先进的网络配置。
Docker 添加功能的现有软件的一个相关示例是:
- tinc:Tinc是一个轻量级的VPN软件,使用隧道和加密实现。
结论
通过集装箱组件提供内部和外部服务是一个非常强大的模型,但网络考虑成为优先事项.虽然Docker通过配置虚拟接口,子网,iptables
和NAT表管理提供了一些此功能,但其他项目已经创建以提供更先进的配置。
在 下一个指南中,我们将讨论编程器和编排工具如何建立在这个基础上,以提供集群集装箱管理功能。