内容摘录自极客时间课程《趣谈网络协议》,如有侵权,请及时联系删除。


目录

  • 容器技术中的网络
  • 命名空间(namespace)
  • 为什么需要namespace
  • 命令行工具ip netns
  • cgroup(control groups)机制
  • 容器网络如何接入物理网络


容器技术中的网络

容器(Container)另一个意思是集装箱。其实容器的思想就是要变成软件交付的集装箱。集装箱的特点,一是打包,二是标准。

封闭的环境主要使用两种技术,一种是看起来隔离的技术,称为namespace,即每个namespace中的应用看到的是不同的IP地址、用户空间、程号等。另一种是用起来隔离的技术,称为cgroup,也即明明整台机器有很多的CPU、内存,而一个应用只能用其中的一部分。

镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID1和RAID10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。

命名空间(namespace)

为什么需要namespace

在很多面向对象的程序设计语言里面,都有命名空间。大家一起写代码,难免会起相同的名词,编译就会冲突。而每个功能都有自己的命名空间,在不同的空间里面,类名相同,就不会冲突。
在Linux下也是这样,很多的资源都是全局的。比如进程有全局的进程 ID,网络也有全局的路由表。但是,当一台 Linux 上跑多个进程的时候,如果我们想使用不同的路由策略,这些进程可能会冲突,那就需要将这些进程放在一个独立的namespace里面,这样就可以独立配置网络了。相关命令为ip netns,用于创建、删除、查询namespace。

命令行工具ip netns

ip netns add ns_name 用于创建一个ns_name空间
ip netns exec ns_name bash_command (ip -n ns_name bash_command) 在name空间下执行bash_command命令
ip link set network_interface netns ns_name 将网卡network_interface添加到ns_name空间下
(另外对于网卡,还需要设置ip地址,路由,NAT规则等)

cgroup(control groups)机制

cgroup是Linux内核提供的一种可以限制、隔离进程使用的资源机制。
cgroup可以控制如下子系统:

  1. CPU子系统使用调度程序为进程控制 CPU 的访问;
  2. cpuset,如果是多核心的CPU,这个子系统会为进程分配单独的CPU和内存;
  3. memory子系统,设置进程的内存限制以及产生内存资源报告;
  4. blkio子系统,设置限制每个块设备的输入输出控制;
  5. net_cls,这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux流量控制程序(TC)识别从具体cgroup中生成的数据包。

cgroup 提供了一个虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。
(具体配置命令mount、tc filter add)

容器网络如何接入物理网络

镜像网口需要网卡吗 镜像网络是什么_命名空间


在 Linux 下,可以创建一对 veth pair 的网卡,从一边发送包,另一边就能收到。为了实现物理机内不同docker之间的访问,veth pair的一端需配置在docker0网桥上,另一端需配置在容器的进程空间namespace下。

为了实现docker对外网的访问,需要配置NAT。

Docker实现端口映射的方式:

  1. docker-proxy进程:监听10080并转换为80端口;
  2. DNAT:在-A PREROUTING阶段加一个规则,将到端口10080的DNAT为容器的私有网络