[Docker][Docker NetWork][上]详细讲解

DieSnowK 2024-08-21 10:07:02 阅读 58

目录

1.为什么需要网络管理2.Docker 网络架构简介0.铺垫说明1.CNM2.Libnetwork3.驱动

3.常见网络类型1.bridge 网络2.host 网络3.container 网络4.none 网络5.overlay 网络


1.为什么需要网络管理

容器的网络默认与宿主机及其他容器都是相互隔离, 但同时也要考虑以下问题, 比如:

多个容器之间是如何通信的容器和宿主机是如何通信的容器和外界主机是如何通信的容器中要运行一些网络应用(如 nginx、web应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现容器不想让它的网络与宿主机、与其他容器隔离应该如何实现容器根本不需要网络的时候应该如何实现容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现…


2.Docker 网络架构简介

0.铺垫说明

Docker容器网络是为应用程序所创造的虚拟环境的一部分它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块Docker为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和 驱动

1.CNM

Docker网络架构采用的设计规范是CNM(Container Network Model)CNM中规定了Docker网络的基础组成要素

Sandbox

提供了容器的虚拟网络栈

即:端口、套接字、IP路由表、防火墙、 DNS配置等内容 主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境 Network:Docker内部的虚拟子网,使得网络内的参与者能够进行通讯Endpoint

虚拟网络的接口,就像普通网络接口一样,Endpoint的主要职责是负责创建连接Endpoint类似于常见的网络适配器,那也就意味着一个Endpoint只能接入某一个网络, 当容器需要接入到多个网络,就需要多个Endpoint 如下图所示,容器B有两个Endpoint并且分别接入Networkd A和Network B。那么容器A和容器B之间是可以实现通信的,因为都接入了NetworkA。但是容器A和容器C不可以通过容器B的两个Endpoint通信

请添加图片描述

2.Libnetwork

Libnetwork是CNM的一个标准实现Libnetwork是开源库,采用Go语言编写(跨平台的),也是Docker所使用的库,Docker网络架构的核心代码都在这个库中。 Libnetwork实现了CNM中定义的全部三个组件,此外它还实现了本地服务发现、基于Ingress的容器负载均衡,以及网络控制层和管理层等功能

3.驱动

驱动主要负责实现数据层相关内容

例如:网络的连通性和隔离性是由驱动来处理的 驱动通过实现特定网络类型的方式扩展了Docker网络栈

例如:桥接网络和覆盖网络 Docker内置了若干驱动,通常被称作原生驱动或者本地驱动

例如:Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver等等每个驱动负责创建其上所有网络资源的创建和管理


3.常见网络类型

1.bridge 网络

bridge驱动会在Docker管理的主机上创建一个Linux网桥

默认情况下,网桥上的容器可以相互通信也可以通过bridge驱动程序配置,实现对外部容器的访问 Docker容器的默认网络驱动,当需要多个容器在同一个Docker主机上通信时,桥接网络是最佳选择另外,在Docker安装时,会自动安装一块Docker网卡称为docker0,它是一个网桥设备,主要用于Docker各容器及宿主机的网络通信

2.host 网络

对于独立容器,移除容器和Docker主机之间的网络隔离,并直接使用主机的网络当网络堆栈不应该与Docker主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择

3.container 网络

这个模式指定新创建的容器和已经存在的一个容器共享一个网络 ,而不是和宿主机共享新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口等两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的

两个容器的进程可以通过IO网卡设备通信

4.none 网络

Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置

也就是说,这个Docker容器没有网卡、IP、路由等信息 容器网络完全隔离

5.overlay 网络

借助Docker集群模块Docker Swarm搭建的跨Docker Daemon网络,将多个Docker守护进程连接在一起,使集群服务能够相互通信当需要运行在不同Docker主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择

请添加图片描述




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。