,IT工程师需要掌握的容器技术Docker跨主机网络通信跨主机容器网络解决方案主要有以下几种:1)docker原生方案macvlan和overlay网络2)第三方方案如如flannel,calico,contiv等。本章主要介绍容器原生网络方案,因为每一个第三方方案都可以一篇文章讲解。如果读者对第三方解决方案感兴趣,欢迎在文章下方留言,小编会根据读者的需求进行讲解。02容器网络模型和网络库容器之所以有这么多的网络解决方案,离不开容器优秀的架构设计。Docker通过libnetwork网络库和CNM网络模型将很多网段解决方案与docker集成在一起。libnetwork是一个网络网络库,其核心功能是定义容器网络模型(CNM)。网络模型主要由以下三个部分组成:1)SandboxSandbox是一个容器网络栈。Sandbox通过linux命名空间技术实现容器不同网络的隔离。沙盒可以包含来自不同网络的端点。2)EndpointEndpoint表示容器访问网络的端点,其作用是将Sandbox连接到网络。Endpoint只能属于一个网络,也只能属于一个Sandbox。3)Network代表一组可以直接相互通信的Endpoint,可以基于LinuxBridge或者VLAN来实现。上图是一个典型的DockerCNM模型图。每个容器都有一个沙箱。Sandbox通过Endpoint与Netwrok互连。Endpoint是通过linux的veth对实现的。一端连接linuxbridge,另一端挂载在容器中(比如eth0网卡),因为是这种规范模型,只要网络插件符合这种模型,就可以和docker一起工作守护进程来实现容器网络。03Dockeroverlay网络Docker原生提供了Overlay网络驱动,可以用来创建基于Vxlan的Overlay网络。Vxlan网络可以将二层数据封装成UDP包进行传输,从而实现二层数据包通过三层网络的透传。VXLAN协议是目前应用广泛的网络协议。由于本文的重点不在协议范围内,有兴趣的可以在文末留言。如果有需要,我们后面会单独写一篇文章来写关于Vxlan的。DockerOverlay网络需要一个key-value数据库来保存网络状态信息,包括网络、Endpoint、IP等。consul、etcd、zookeeper是docker支持的key-value存储软件。我们先来看看我们的overlay实验环境的拓扑结构。在本次实验中,我们使用consul作为key-value存储软件。下面我们来看看如何搭建这个实验1)首先,我们在两台主机的docker.service文件的ExecStart=命令后添加指向consul的配置参数。具体操作如下(本次实验针对两台centos7.5系统Host)添加配置参数后,我们重启docker服务。具体命令如下1.#重启docker服务2.systemctldaemon-reload&&systemctlrestartdocker2)然后我们安装consul软件,我们部署在主机172.17.0.3上,以容器的形式部署,容器的网络使用host,让软件启动的所有网络接口都暴露在host上。具体操作命令如下1.#启动consul容器2.dockerrun-d--networkhost-hconsul--name=consul\3.--restart=always-eCONSUL_BIND_INTERFACE=eth0consul:1.5.2consul启动后,我们检查它启动的界面。我们在浏览器中输入它的地址端口号8500来登录consul页面。详情如下。其实我们点击key/value菜单可以查看到我们注册到consul的两台主机3)现在我们在host1主机上创建一个overlay网络具体操作如下1.#创建一个容器overlay网络ov_net12.dockernetworkcreate-doverlayov_net1实际上,当你在host1主机上创建ov_net1的网络consul时,会自动将网络信息同步到host2主机上,我们在host2主机上进行验证。4)我们在主机host1上创建一个容器test1,并设置网络为ov_net1。具体操作如下1.#创建容器test1,并指定网络为ov_net12.dockerrun-itd--nametest1--hostnametest1--networkov_net1busybox其实我们创建容器test1后,docker会自动创建一个bridge网络docker_gwbridge,用于我们上面提到的eth1网卡。这样容器就可以访问外网了。我们看一下test1容器的路由信息??。我们可以发现它的默认路由直接指向了eth1接口。同时ping外网确实可以ping通。5)最后,我们在host2主机上创建test2容器,指定其网络为ov_net1,然后验证test1和test2是否可以互通。如上图所示,我们在host2主机上成功创建了test2容器,它还自动配置了两个网卡接口,一个用于连接覆盖网络,一个用于连接外网。下面我们来测试下test2容器能否ping通test1容器。具体操作如下。测试发现test2容器确实可以ping通test1容器。同时,它还实现了DNS功能,主动映射test1容器的名称,其对应的IP为10.0.0.2。下面我们来看看overlay网络连接的具体逻辑。Docker将为每个覆盖网络创建一个独立的命名空间。在命名空间中,将创建一个br0网桥。上面有两组端点,一组端点的一端相连。br0的一端连接容器的eth0端口,另一组endponit的一端连接br0的另一端到vxlan接口。该接口用于在主机之间建立vxlan隧道。不同主机上的容器通过这个隧道进行通信。具体架构图如下:04DockerMacVlan网络Macvlan其实是linux系统自带的一种技术,可以让你在物理网卡上创建子接口。这些创建的每个子接口都有自己唯一的MAC地址。同时,你也可以在这些子接口上配置IP,然后你可以将应用程序、虚拟机、容器绑定到指定的子接口上,这样你自己的MAC和IP就可以直接连接物理网络了。Macvlan最大的优点就是性能更好。缺点是很多nic对mac地址数量有限制。Macvlan的具体架构如下图所示:由于Macvlan在生产环境中很少部署,本文不做实验演示。我们将在这里展示创建它的具体命令。有兴趣的可以根据以下命令自行搭建环境测试。1.#创建macvlan网络mv_net1,其中parent=eth0是macvlan网络使用的指定接口2.dockernetworkcreate-dmacvlan-oparent=eth0mv_net13.#创建容器test3并指定其网络为mv_net1的macvlan网络4.dockerrun-d--nametest3--networkmv_net1busybox
