Docker技术原理
前言
前几周,打算将一些常用的渗透测试工具部署到服务器上,部署经过了多次失败,发现使用Docker是一个很好的选择,很多常用的工具都已经被人做好了image
放到的DockerHub上,直接pull
即可,很是方便,于是我也选择了使用Docker来部署我的工具集。
使用Docker时,我发现Docker只能运行在Linux内核下,于是我对Docker的实现方法产生了好奇,通过搜索引擎检索,我算是懵懵懂懂的了解了Docker的实现原理,并且进一步了解了Linux系统。
本文参考于Docker 核心技术与实现原理,Docker具体的实现原理请直接阅读原文。本文只谈论我关心的一些Docker技术。
What is Docker?
要了解Docker,首先我们必须要了解什么是容器,虽然类似虚拟化技术,但是和虚拟化有着天壤之别的技术实现。在虚拟化技术中,运行一个完整的操作系统及其中包含的应用程序需要一套完整的虚拟化硬件来支持,并且每个操作系统以及附带的依赖环境都是类似的。而容器就是实现了复用这些操作系统资源和依赖环境。容器是依赖于Linux Container(LXC)
技术,LXC
是一种内核轻量级的操作系统层的虚拟化技术,相比较虚拟化技术,它有如下的有点:
- 与宿主机使用同一个内核,性能损耗小
- 不需要指令集模拟
- 不需要及时翻译
- 容器可以在CPU核心的本地运行指令,不需要任何的解释器
- 避免了准虚拟化和系统调用替换中的复杂性
- 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享
LXC使用了chroot
、namespaces
、CGroups
技术来实现虚拟化技术,而这些技术刚好也用来实现Docker,或者换一句话来说,Docker的最初版本是通过LXC实现的。
介绍完容器,我们来看看Docker,Docker其实是一个轻量级的容器管理引擎,它通过提供各种容器管理工具让用户无需关注底层的操作,可以更简单的管理和操作容器,同时引入了分层文件系统和镜像机制,极大的提升了用户体验。
Docker核心技术
接下来讲一讲我理解的Docker隔离容器的核心技术,主要是chroot
、namespaces
、CGroups
技术
namespaces
命名空间(namespaces)
是Linux提供用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法,在运行多个服务时,每个进程相对于其他进程都是透明的,任意进程都可以访问宿主机上的任意文件,所以为了让各个进程相互隔离,就诞生了namespaces
技术,以实现系统资源的隔离,目前Linux提供了六类系统系统资源的隔离机制:
Mount
隔离文件系统挂载点UTS
隔离主机名和域名信息IPC
隔离进程间的通信PID
隔离进程的IDNetwork
隔离网络资源User
隔离用户和用户组的ID
其中Docker使用PID
实现各个容器内部与宿主机隔离,每当Docker运行一个容器时,都会使用下面的方法来创建用于设置进程间隔离的Spec
:
func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) {
s := oci.DefaultSpec()
// ...
if err := setNamespaces(daemon, &s, c); err != nil {
return nil, fmt.Errorf("linux spec namespaces: %v", err)
}
return &s, nil
}
在setNamespaces
方法中会设置进程、用户、网络、IPC、UTS相关的命名空间,最后作为参数创建容器
chroot
chroot
即为change root directory
,在Linux中,系统默认的根目录都是/
,在使用chroot
后,系统的根目录将以指定位置作为/
,在使用了chroot
后,系统无法读取到旧系统根目录下的文件,增加了系统的安全性,限制了某些用户访问文件的权力,通过chroot
即可建立一个与原系统完全隔离的目录结构,即使新建立的目录结构遭到破坏,也不会对旧目录结构产生任何影响。详细介绍chroot
的资料可以查看https://web.archive.org/web/20150219033115/http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/index.html
CGroups
CGroups
即为Control Groups
,是Linux内核提供的一种物理资源隔离机制,通过该机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能,Docker使用该技术实现了物理资源的隔离以及限制各个容器性能。各个进程使用CGroups
以控制族群
为单位分配资源。详细介绍CGroups
的资料可以查看https://web.archive.org/web/20200918083600/https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
总结
上述对三个来源于LXC技术实现了Docker的核心隔离模块,但是Docker并不是只由LXC技术实现的,还包括其他技术,比如使用网桥实现宿主机与容器通信,使用AUFS挂在储存等,但是相比较其他技术,LXC才是Docker实现隔离最重要的技术,同时通过学习Docker隔离原理,我也学习了很多Linux相关的知识,刚好最近也在看《操作系统概念》这本书,不知道对我理解操作系统有没有帮助。
《Docker技术原理》链接:https://xdym11235.com/archives/62.html
具体版权规定详见侧栏版权说明页面