Docker基础原理

1. 前言

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他的种类的容器还有Kata container,Rocket container等等。

2. 优势

2.1 高效有序的资源利用

  • 单机部署多个应用;
  • 应用之前相互隔离;
  • 应用之间不会发生资源抢占,每个应用只能使用事先注册申请的资源;

2.2 一次编译,到处运行

  • 类似Java代码,应用及依赖的环境构建一次,可以到处运行

3. 底层原理

Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。

3.1 Namespace

Linux Namespace 是Linux 提供的一种内核级别环境隔离的方法,使其中的进程好像拥有独立的操作系统环境。Linux Namespace 有 Mount Namespace,UTS Namespace, IPC Namespace, PID Namespace, Network Namespace, User Namespace, Cgroup Namespace。详细见下表:

分类 系统调用参数 隔离内容 内核版本
Mount Namespace CLONE_NEWNS 文件系统挂载点 Linux 2.4.19(2002年)
UTS Namespace CLONE_NEWUTS Hostname和domain name Linux 2.6.19
IPC Namespace CLONE_NEWIPC 进程间通信方式,例如消息队列 Linux 2.6.19
PID Namespace CLONE_NEWPID 进程ID编号 Linux 2.6.24
Network Namespace, CLONE_NEWNET 网络设备,协议栈,路由表,防火墙规则,端口等 Linux 2.6.24 start Linux 2.6.29 end
User Namespace CLONE_NEWUSER 用户及组ID Linux 2.6.23 start Linux 3.8 end
Cgroup Namespace CLONE_NEWCGROUP Cgroup根目录 Linux 4.6
  • clone 创建新进程并设置它的Namespace,类似于fork系统调用,可创建新进程并且指定子进程将要执行的函数,通过上述CLONE_NEWNS等参数使某类资源处于隔离状态

3.2 Cgroup

Linux Cgroup 全称是Linux Control Group。它最主要的作用是限制一个进程组能够使用的资源上限,包括CPU,MEM,DISK,NET等等。

需要特殊指出的是MEM是硬限制,当容器的内存使用量超过了Cgroup限定值会被系统OOM。

3.3 Union FS

Union FS,全称是Union File System,联合文件系统。将多个不同位置的目录联合挂载到同一个目录,将相同的部分合并。Docker利用这种联合挂载能力,将容器镜像里面的多层内容呈现为统一的rootfs(根文件系统),即root用户能够看到的根目录底下所有的目录文件。rootfs打包了整个操作系统的文件和目录,是应用运行时所需要的最完整的“依赖库”,也就是我们说的“镜像”。

3.3.1 镜像

  • 只读层
  • Init层

Init 层存放的是/etc/hostname,/etc/resolv.conf 等, docker commit的时候不提交。

  • 读写层

读写层一开始的时候为空,用户如果修改了文件系统,比如说增删改了文件,docker commit的时候就会提交这一层信息。

4. 虚拟机 VS Docker

4.1 架构图

4.2 对比

从上面这幅图就可以看出,虚拟机是正儿八经的存在一层硬件虚拟层,模拟出了运行一个操作系统需要的各种硬件,例如CPU,MEM,IO等设备。然后在虚拟的硬件上安装了一个新的操作系统Guest OS。所以在Windows宿主机上面可以跑Linux虚拟机。因为多了一层虚拟,所以虚拟机的性能必然会有所损耗。

Docker容器是由Docker Deamon(Docker Deamon是运行在宿主机上面的一个后台进程,负责拉起和设置容器)拉起的一个个进程,通过Docker Deamon设置完Namespace和Cgroup之后,本质上就是一个运行在宿主机上面的进程。因为没有一层虚拟的Guest OS,所以Docker轻量级很多。

但是有利就有弊,由于Docker 容器直接运行在宿主机上面,安全性就相对较差些,另外也没有办法在Windows上面运行Linux的容器,如果容器里面的应用对特定系统内核有要求也不能运行在不满足要求的宿主机上面。

5. 总结

Docker 容器总结起来就是利用Linux Namespace做资源隔离,Cgroup做资源上限限制,rootfs做文件系统 运行在宿主机上面的一个特殊进程。

在使用上,可以结合虚拟机和Docker配合进行生产环境及测试环境的构建,达到资源更合理的分配。

版权声明:
作者:lee
链接:https://www.goufusheng.top/archives/737
来源:苟浮生的桃花扇
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录