《基于Kubernetes的容器云平台实战》——1.4.3 容器网络
1.4.3 容器网络
不得不说,容器网络是一个很大的话题,这里很难完全展开,下面仅仅对Docker中容器的构建方式进行简单的介绍。需要注意的是,这里描述的仅仅是Docker中的处理模式,并不代表容器网络只能采用这种方式构建,比如在Kubernetes中采用的就是另外一种模式。
从Docker命令行上已经知道,用户可以为新创建的容器指定主机名到IP的映射,能够设定DNS选项,能够设定容器内应用和宿主机上端口之间的映射关系,能够设定容器中网卡的IP地址、MAC地址和本地链路地址,可以通过指定别名的方式在容器中直接访问其他容器,可以指定none、bridge、host以及container:name形式的容器网络模式,还能够引用已经创建好的网络对象的名称。这些功能都是由内部的NetworkController来提供的。
这个内部控制器负责管理bridge、host、overlay等许多内置驱动,还能够通过HTTP接口管理插件形式的远程驱动,通过这些驱动创建出endpoint和network对象。每个endpoint可以理解为网卡,而network则可以包含多个endpoint,并包含更多的网络参数。控制器将endpoint包装到sandbox对象中,其中包含路由、DNS选项等全部内容,同时有唯一的ID。
Docker在创建容器时,先调用控制器创建sandbox对象,再调用容器运行时为容器创建网络命名空间。需要注意,控制器同时还暴露出一个UNIX Domain Socket的监听接口,在Docker调用容器运行时的请求中,已经包含了访问这个监听接口的命令作为容器创建完成之前的钩子命令。容器运行时在创建了容器但还没有启动它之前,会执行这个钩子命令,并且将容器pid等参数通过网络接口发送到控制器中。采用这种网络传输的方式,宿主机上即使有多个容器同时向控制器发送请求,控制器也是以串行的方式来执行。
控制器在接收到容器运行时的请求之后,就会通知驱动,将endpoint加入到容器pid对应的网络命名空间中,并为容器网络准备好其他资源。这样就为容器启动准备好了网络环境。
- 点赞
- 收藏
- 关注作者
评论(0)