运维基本功——容器间网络访问与通信管理

容器网络

docker有以下几种网络模式:

  • Docker原生网络
    • 默认网络
      • none网络
      • host网络
      • bridge网络
    • 自定义网络
      • 自定义bridge网络
      • 自定义overlay网络
      • 自定义macvlan网络
  • 第三方网络
    • flanel网络
    • weave网络
    • calico网络

本文我们重点探讨Docker三种默认网络模式。

默认none网络

在这里插入图片描述
这种网络模式的意思是容器启动后,不需要和外部沟通,既不需要外部入侵,也不访问外部的资源。上图中,我们可以看到一共两个虚拟机,每个虚拟机里面运行着两个容器,外部的资源是不可以访问容器的,如果想要访问容器,那么就需要用docker的命令连接进来。
两个服务器之间可以很好的沟通,但是容器之间都不能沟通,每个容器独立做业务处理、数据处理,它只处理一些底层的后台数据,它和服务器之间有数据交流,但是和外网没有任何交流,这就是none网络。

默认host网络

这种网络是服务器与容器之间共享ip地址

在这里插入图片描述

图中,我们同样每个服务器两个容器,每个服务器的ip和其内部任何一个容器共享,当访问者发指令给服务器的时候,它同时也发给了容器,这时候容器和服务器之间采取一个端口争夺的方式,比如我们服务器占22端口,访问者ssh这个ip地址22永远访问的是服务器,容器可以占80端口比如Apache,而另外一个容器就不能占用一样的80端口的Apache服务了,我们必须在容器内部启动应用的时候指定成其它的端口,比如8080端口,然后它就会自动的占用服务器的8080端口。

这种方式其实就是服务器和每个容器之间都要进行端口的争夺,这是一种比较简单快速的对外提供互联的方式,但是不是我们生产环境中比较良好的方式,因为这样会有太多的端口冲突,特别是常用端口,在一个服务器上启动一个容器后,再启动另外一个容器,那么这个容器就不能运行同样的端口了。

默认bridge网络

在这里插入图片描述

比较好的方式是这种bridge,这种模式和虚拟机中的网桥模式很类似,我们启动一个虚机通过网桥跟外部互联,那启动一个容器,我们这里用docker0这个Default的默认网桥跟外网进行互联,那当启动第二个容器的时候,如果你取的是默认bridge,那还是用docker0这个桥跟外网连。

当应用启动的时候,它会通过docker0做一个端口映射,比如容器1运行80端口,容器2也运行80端口,这样没有问题,当我们映射到服务器的时候,比如容器1映射到了8080端口,容器2映射到9090端口,访问者访问服务器的9090端口时就会自动的访问容器2里面的80端口,这样我们就可以启动一堆的容器,当然也可以占用同样的端口,当映射到服务器上面的时候,我们选择服务器上面不同的端口定位对外进行服务,同样的道理,容器要想访问外网的时候,我们可以通过网桥很自然的访问外网所有资源,不受限制,这是一个最常见最友善的网络环境。

自定义bridge网络

在默认bridge基础上,我们可以自定义bridge网络,每个用户可以自定义自己的bridge。
如下图:
在这里插入图片描述
比如你给容器1建一个叫br,你建完后它会给你一串名字比如br-123,那么其他容器你就不需要建bridge了,你可以绑定一个同样的bridge,那他们就会在同样的网桥环境当中,他们就可以绑定同样一个网桥的环境对外提供服务,这时候我们也希望他们能够绑定在不同的端口上,因为他们也是相当于绑定在同一个ip地址。

一样的道理,我们在另一个服务器上也可以做类似的操作:
在这里插入图片描述
这样用户就可以轻易的访问服务器1也可以轻易的访问服务器2,服务器1和服务器2之间也可以通过NAT转出去通过PAT转进来,访问另外一台服务器的网络环境的端口,同时它与默认bridge相比还多了一个NAT转换的过程,这个bridge还帮忙做了一部分地址转换,当你同服务器1 ping 到服务器3的时候可以用hostname直接访问它,而不需要用ip地址,这也是使用自定义bridge的一种优势。

自定义overlay网络

除了上面这些,我们后续的一些自定义内容会偏重于多个容器中间的互通,形成容器之间的集群,我们这里的自定义overlay就是这样的目的。
在这里插入图片描述

两个服务器它有一个依赖条件,要共享一个键值对的service consul,你可以人工建,你也可以在容器里建,总之你要建立这样一个服务,然后在我们docker容器里面你要创建一个overlay的网络,在执行命令的时候你要指向这个consul,当你建立完这个网络后,另外一个同样指向这个consul的服务器的docker deamon它也会同时建立一个一模一样的bridge,这两个bridge之间会实现一个大二层连接,就是一个自动的过程,只要你把服务器的deamon都指向同一个consul,这样的好处就是你在服务器1里面启动的容器和服务器2启动的容器,其实都互联在同样一个大二层,所谓大二层可以理解为你是公司A,我是公司B,用的是不同的网络,但是希望这两个公司里有两个人成为一个虚拟子公司,这样这两个人的交易就在虚拟子公司之间划账就可以了,这个虚拟子公司就可以理解为在网络层的一个大二层,他们之间就可以很方便的进行互通,两个服务之间的容器就感觉像是在一起一样,所以很适合于集群。
但是它也有一个缺点,就是与访问者之间没有交互。

自定义macvlan网络

这种方式就是通过mac实现vlan,这种实现的方式比较简单。
在这里插入图片描述

就是创建一个特殊的vlan的时候,把这两个mac地址给互相串起来,不用第三方的服务做支撑,串起来之后,当你启动容器的时候,你用这样一对互通的mac进行沟通的话,就相当于这四个容器在一个ip地址上,在一个以太网上绑着,它们之间可以很方便的通过一个macvlan沟通,这是一个用的不太多,但是实现很简单的方法,它有一个很致命的要求,就是服务器要处于混杂模式,这个实际生产环境很难达到的要求,因此使用的并不多。
它可以实现容器之间的互通,但无法和访问者进行沟通。

第三方flannel网络

这种称为“法兰绒”。
大致是这样的:
在这里插入图片描述
这种方式,既可以实现应用之间的互通,又可以实现第三方的沟通。
同样它也要求我们搭建一个键值对服务器etcd,所有的docker deamon与它进行沟通,我们在建立网络的时候,同时在多个docker所在虚拟机或服务器上面建立flannel.1,就是刚刚上面提到过的大二层网络,同时我们启动容器的时候,会把容器docker0的bridge自动绑在flannel.1上,这时docker0的优势NAT,也就是外面访问他们,可以通过PAT进行端口映射,同样他们也可以访问外面,用inet进行访问。
因此,flannel也是一个非常常用的实现与外界访问互通、内部集群管理的网络解决方案。

第三方weave网络

这种第三方网络解决方案称为“针织布”。
在这里插入图片描述

服务器1它会在容器启动的时候加入两个网络,一个是bridge网络,一个是针织布数据流通道网络。
同样,另一个服务器也是一样的,这两个服务器的针织布之间,会通过配置使他们之间进行互通,同时外网的应用要想访问他们,也可以直接让外网应用访问实际的ip地址,这个ip地址直接绑定在针织布上,这就是针织布的优势,可以把服务器的ip地址直接绑上去,这样外网里的数据流可以直接通过针织布来访问容器,类似于端口映射的感觉。

但是它也有复杂的一面,看下图:
在这里插入图片描述

如果容器要对外提供访问,去访问外网资源的话,那么它不走针织布,还是走docker里面的NAT转换,这就使得整个网络的流非常之复杂,生产系统也有不少采用针织布网络来实现对外访问的集群,但是从来不访问外部的资源。

第三方calico网络

这种网络称为"印花布",我们看下这种网络的织布方式:
在这里插入图片描述

它也要先准备一个etcd的键值对配置环境,然后通过deamon 让两个服务器进行沟通,然后一个服务器创建印花布网络的时候,另一个服务器也会创建它的印花布网络,他们之间是通过BGP的路由协议进行互通的,这个路由协议是一个网络层的协议,所以我们可以看出,第一个服务器的容器1、容器2与第二个服务器的容器3、容器4,能很方便的通过路由协议进行互通,也可以很方便的通过路由协议访问外网资源,但是,有一个很大的限制,就是这套路由协议他们都是用的内网地址,虽然他们的内网地址可以通过路由转换去访问外网资源,但是通常很少有用户直接把这个网络暴露给外网,因此外网很少直接访问calico。

猜你喜欢

转载自blog.csdn.net/qq_45455361/article/details/121664391