专栏首页宝哥的专栏Docker系列学习文章 - 网络基本配置(九)
原创

Docker系列学习文章 - 网络基本配置(九)

| 导语 上一篇我们讲解了docker的存储配置,那么这篇文章我们讲下docker的网络。存储解决了docker存东西的问题,网络了解后我们就能知道容器如何连接互通。

传统IT里,系统工程师和网络工程师都是分开的,但是云时代把他们结合在了一起,而且还是比较重要的一块。有些同学在学习云计算虚拟化过程中,因为没怎么太多掌握网络基础,学习起来就比较费劲,加上网络虚拟化技术本身又有点跟不上节奏,这让学习者就更加头疼了。docker作为轻量级的虚拟化,它也离不开网络,特别是后期生产结合K8S创建PAAS平台,不深入理解网络,那么可能会遇到很多困难。

一、docker网络模型

1. Libnetwork项目

docker从v1.7开始,为了能更好的支持网络各种功能,独立创建了一个项目叫libnetwork。通过这个项目,docker希望统一容器这块的网络层标准。

2. CNM(Container Network Model)

libnetwork 是一个项目,它是一个网络代码库。那么具体的实现模型是CNM,CNM提供了用于开发的多种网络驱动。

从上面图可以看出,libnetwork作为一个网络代码库,向上对docker daemon守护进程提供了API接口,让其调用;向下也提供了各种网络模式类型的接口和驱动。而这些具体的实现就是通过CNM来完成的。

3. CNM的组成

CNM主要由三个要素组成,sandbox(沙盒)、endpoint(接入端点)、network(网络)。

sandbox(沙盒):一个沙盒可以有多个接入端点和多个网络;一个沙盒可以代表一个容器,里面包含了一个容器的网络栈所有信息,底层的技术实现就是Linux的network namespace。

endpoint(接入端点):一个endpoint可以对接一个沙盒和一个网络,实现方式可以是veth pair、ovs内部端口技术;一个endpoint只能存在一个沙盒中,不能同时存在多个沙盒里,其实就像交换机的接口,不能同时存在两个不同交换机里。所以,我们给不同沙盒添加不同的endpoint,就能让沙盒接入不同的网络。

network(网络):一个网络由一组互相联通的endpoint组成,技术实现可以是Linux bridge、vlan、vxlan等等。一个网络可以包括多个endpoint。

4. CNM的具体实现流程

首先,驱动要注册自己到网络控制器里,控制器根据类型创建network网络;

其次,网络控制器在创建好的网络上创建endpoint接入端点;

最后,把容器连接到endpoint接入端点即可。

如果是删除销毁,那么顺序反过来即可。先是把容器从endpoint接入端点拔出,然后是删除endpoint,最后是删除网络。

CNM的出现,让容器的网络使用更加的简单,底层具体实现不需要关心。第三方网络插件要接入容器里,只要提供了network(网络)和endpoint(接入端点)就能联通容器。有了CNM,容器本身和网络就解耦了,灵活性大大增强。

二、docker内置网络驱动

上面第一点我们讲了libnetwork和CNM,了解了docker的网络模型基本概念和组成。那么这点我们讲下目前docker libnetwork支持的几种网络驱动模式。目前支持以下五种驱动类型:

1. bridge网桥模式

这个驱动是docker默认设置,我们安装好docker后你会发现默认会创建一个叫docker0的网桥,那么创建好的容器会默认使用这个网桥。这个其实就是linux bridge,在单机内使用网桥模式可以满足,与外界通信那么这里会用到NAT。

2. host主机模式

这个模式是容器与主机共享同一网络namespace,那么里面的网络协议栈、路由表、iptables规则、网卡、IP、端口等等都是共享的。容器跟宿主机都在同一网络视图下。这个模式很好的解决了容器与外界通信地址转换的问题,可以直接使用宿主机的IP进行通信,那么这里的网络流量和压力走的都是宿主机的网卡,性能会比较高。不过这个有风险,因为容器跟宿主机是共享一套网络机制,没有隔离。那么会引起网络资源与宿主机的竞争和冲突关系。规模小的场景,可以使用这种模式。

3. overlay模式

这个是docker原生提供的跨主机多子网的网络方案。其实实现的机制就是vxlan和linuxbridge,不过使用这种模式需要安装etcd、consul、zookeeper这样的KV键值对数据存储系统来提供信息同步支持。有了这个模式,docker容器就能实现跨主机多子网互联。

4.macvlan模式

macvlan跟overlay一样也是跨主机互联的驱动方案。macvlan本身是linu kernel模块,原理是在宿主机物理网卡上虚拟出多个子网卡(同一物理网卡上配置多了MAC地址,即:多个interface),通过不同的MAC地址在数据链路层(Data Link Layer)进行网络数据转发的,它是比较新的网络虚拟化技术,需要较新的内核支持(Linux kernel v3.9–3.19 and 4.0+)。macvlan最大的优点是性能极好,相比其他方案,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络,另外macvlan还支持802.1q trunk等更为复杂的网络拓扑结构。这里也要注意几点:其一,macvlan会独占主机的网卡,也就是说一个网卡只能创建一个macvlan网络,否则会报错;其二,同一个macvlan下的网络能ping通,不同的macvlan网络之间不能通信,也就是说不同的macvlan网络不能在二层上通信,在三层可以通过网关进行通信。总之,macvlan网络的连通性和隔离性完全依赖VLAN,IP subnet和路由,docker 本身不做任何限制,用户可以像管理传统VLAN网络那样管理macvlan。

5.none模式

这个模式是docker提供的最简单的网络驱动模式。容器内的网络配置是空的,容器单独享用一个network namespace,是一个封闭的网络环境。容器启动后无任何网络连接,你会看到就是一个lo环回接口(loopback), 如果你需要让容器与外界互联,那么需要自己手动给容器配置网络接口、IP、路由等等,灵活性最强。

以上五种驱动都是docker原生提供的,如果以上五种不能满足你的要求,除了原生提供,还支持第三方的驱动模式接入。比如常用的 flannel、pipework、weave 和 calico 等等。

三、docker网络操作的基本命令

这里介绍下docker network比较基础的几个命令:

docker network ls List networks 罗列容器网络列表

docker network create Create a network 创建一个容器的网络

docker network connect Connect a container to a network 让一个容器连接到指定的网络

docker network disconnect Disconnect a container from a network 从一个容器里的网络断开

docker network inspect Display detailed information on one or more networks 查看网络内部的详细信息

docker network prune Remove all unused networks 清理没有再被使用和引用的网络列表

docker network rm Remove one or more networks 删除一个和多个网络

1. 查看网络列表命令

我们直接使用docker network ls即可查看:

2. 创建容器网络

直接用 docker network create network-name 能创建一个新的bridge类型的网络

这个br-842a5a8ed4a0 就是新建的bridge,IP段是172.18.0.1/16。

如果你想创建一个其他类型的网络,比如overlay等类型,加个 -d 参数跟上类型即可,比如:

# docker network create -d overlay test-overlay-network

不过创建overlay类型的网络前提一些条件得准备好,比如etcd KV存储的搭建。

3. 让容器连接到一个网络

前面创建好了一个网络,那么怎么让容器连接用这个网络呢?这里就要用到docker network connect 命令了。

这里我们通过一个实验来讲解下这个命令:

1) 先创建两个容器 docker1, docker2 # docker run -itd --name=docker1 busybox # docker run -itd --name=docker2 busybox

2) 创建一个网络名字叫mynet, 网段是172.19.0.0/16 # docker network create -d bridge --subnet 172.19.0.0/16 mynet

3) 将容器docker2连接到新建网络mynet

# docker network connect mynet docker2

我们用docker network inspect mynet 查看mynet网络可以看到docker2在这个mynet下面了,ip是172.19.0.2

4) 创建最后一个容器docker3,然后连接的网络也是mynet # docker run --net=mynet --ip=172.19.0.3 -itd --name=docker3 busybox

查看mynet详细信息,发现docker3 IP:172.19.0.3 也在里面了,并且docker2和docker3能相互ping通

4. 让一个容器从某个网络中断开

docker network disconnect 就是这个作用的

接着上面的实验环境,我们把docker3从mynet 断开试试,我们只需要操作:

# docker network disconnect mynet docker3

我们发现mynet2里面已经没有docker3了,只剩下docker2。

5. 查看一个网络的详细信息

docker network inspect + 网络名 即可知道,上面实验我们就用到了这个命令,比如查看mynet的详细信息:

inspect 这个单词本身就是“检查”的意思。

6. 一键清理无用的网络列表

这里我们先用docker network create 创建三个网络,test1、test2、test3,然后这三个网络都没挂载任何容器实例。

接着我们使用docker network prune 一键清理看下,是否能全部清除。

我们直接运行docker network prune命令,发现会先有个提示,问你到底要不要清除空闲的所有network,我们按Y,然后就清理了。

我们再运行docker network ls,发现test1、test2、test3 还有之前创建的test-network都清理了。

7. 删除一个网络

如果你看一个网络不爽,想删除,那么就用docker network rm + 网络名 即可。

不过删除之前最好确认下这个网络是否正在使用,如果有容器实例在使用,可以先disconnect一下,最后在删除。

总结:以上就是docker网络的基本介绍,都是一些相对基础的概念,学习掌握后一些基本的知识就能掌握了。不过容器网络跟虚拟化网络技术离不开,要了解得非常熟悉以保证后期生产实践无任何障碍,那需要花很多的精力投入才行。这里大家可以从容器网络启动过程、访问控制、Flannel、Weave、OVS等方向再深入研究。后期了解完docker后,k8s网络方面也可以再学习下,这样网络生产实践方面应该就没什么问题了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务:API网关在API安全中的作用

    当从单体应用程序切换到微服务时,来自客户端的行为不能与以前一样,单体架构客户端只有一个入口点到应用程序。

    程序你好
  • 观察者模式--DataBinding的原理和坑

    上一次我们介绍了DataBinding的应用,不过只在应用层面描述了下,没有做深入分析。 关于DataBinding的实现原理,它的根本思想是观察者模式。 这篇...

    PhoenixZheng
  • 系统集成模式介绍

    在当今的mashup-driven(混搭驱动)的世界中,使用集成来提取、转换和利用数据是大多数软件工程师的首要任务。理解经过验证的集成模式很重要,它可以帮助简化...

    程序你好
  • Java 面试就业指导,100 % 提高面试成功率!

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?

    Java技术栈
  • 为什么应该使用RESTful Web服务设计

    你可能负责一个API。也许你正准备投入制作一个,并且很期待开始。但是要小心,因为好的API设计可能很难。

    程序你好
  • Spring中使用RedisTemplate操作Redis(spring-data-redis)

    Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zs...

    小勇DW3
  • $.ajax()

    天天_哥
  • 开发必须了解的10个Android库

    作为一个开发者来说,避免重复造轮子是很重要的,能让你节省很多时间去专注于开发自己的业务。2018年已经过去一大半了,今天介绍下今年以来业界内比较推崇的几个框架,...

    PhoenixZheng
  • 架构必备「RESTful API」设计技巧经验总结

    【译者注】本文是作者在自己的工作经验中总结出来的RESTful API设计技巧,虽然部分技巧仍有争议,但总体来说还是有一定的参考价值的。以下是译文。

    Java技术栈
  • 微服务架构体系——它适合您的软件开发吗?

    “Microservice architecture provides a range of technical benefits that contribut...

    程序你好

扫码关注云+社区

领取腾讯云代金券