天天看点

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

作者:热爱编程的通信人

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客

利用network namespace,可以为Docker容器创建隔离的网络环境。也可以让Docker容器共享主机或者其他容器的network namespace。

我们在使用docker run命令创建Docker容器时,可以使用--network选项指定容器的网络模式。Docker有以下4种网络模式:

  • bridge模式,通过--network=bridge指定;
  • host模式,通过--network=host指定;
  • container模式,通过--network=container:NAME_or_ID指定,即joiner容器;
  • none模式,通过--network=none指定。

在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络,可以使用docker network ls命令查看,如下所示:

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

2.2.1bridge模式

bridge模式是Docker默认的网络模式。docker0网桥是普通的Linux网桥,而非OVS网桥,因此我们通过brctl命令查看该网桥信息:

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

此时docker0网桥上还没有任何对接的网卡。

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

创建了一个容器后,docker0上就挂接了一块新的网卡(新建容器时创建的),并放在主机network namespace的veth pair一端(一端在docker0中)。

连接在docker0上的所有容器的默认网关均为docker0,而同主机上的容器(同网段)之间通过广播通信。

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

发到主机上要访问Docker容器的报文默认也要经过docker0进行广播,以下为主机的路由表信息:

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

2.2.2host模式

连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。host模式下容器和宿主机共用一个network namespace,使用宿主机的IP和端口。

创建host网络的容器,查看容器的网络信息:

《Kubernetes网络权威指南》读书笔记 | Docker的四大网络模式

host模式下的容器可以看到宿主机的所有网卡信息,甚至可以直接使用宿主机IP地址和主机名与外界通信,无须额外进行NAT,也无须通过Linux bridge进行转发或者进行数据包的封装。

host模式优点是没有性能损耗且配置方便,缺点也很明显,例如:

  • 容器没有隔离、独立的网络栈:容器因与宿主机共用网络栈而争抢网络资源,并且容器崩溃也可能使主机崩溃,导致网络的隔离性不好;
  • 端口资源冲突:宿主机上已经使用的端口就不能再用了。

2.2.3container模式

创建容器时使用--network=container:NAME_or_ID模式,指定容器的网络和一个已经存在的容器共享一个network namespace,这个Docker容器没有网卡、IP、路由等信息,需要手动为Docker容器添加网卡、配置IP等。

两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

Kubernetes的Pod网络采用的就是Docker的container模式网络。

2.2.4none模式

none模式下的容器只有lo回环网络,没有其他网卡。none模式网络可以在容器创建时通过--network=none指定。唯一的用途是客户有充分的自由度做后续的配置。

这种模式下的Docker容器拥有自己的network namespace,需要我们自己为Docker容器添加网卡、配置IP等。

继续阅读