来源:Docker容器安全监控系统设计与实现_简智强
Docker架构
Docker作为Linux容器管理引擎,并不像其它大型分布式系统那样复杂,对用户来说是一个简单的C/S架构系统,其后端也是一个松耦合的架构实现,其中的各个模块充分发挥自身作用,支撑着整个生态的运行,如图为总架构模型。
主要模块包含:Docker客户端、Docker Daemon、镜像仓库、模块驱动、存储卷、Libcontainer等。对用户来说是通过Docker客户端来与Docker Daemon建立通信的。Docker Daemon作为容器架构中的主体部分,提供了服务端功能,接收响应客户端的请求,而后Docker引擎执行内部一系列任务形式的工作。当任务需要容器镜像时,则,通过镜像管理驱动Graph Driver从公共或私有镜像仓库中拉取镜像,并以Graph的形式存储。通过网络管理驱动Network Driver为容器创建并配置网络。通过Exec Driver实现限制容器运行资源、执行用户指令等功能。Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来实现具体的容器操作。执行容器启动命令后,一个实际拥有独立文件系统和服务的Docker容器就处于运行状态。
Libcontainer
Libcontainer是Docker项目中使用Go语言设计实现的库,用于实现直接访问与容器相关的内核API,而不依靠任何依赖。主要功能包括创建并初始化容器,容器的生命周期管理,进程管理。Docker通过Libcontainer实现对容器的具体操纵,包括利用UTS、IPC、PID、Network、Mount、User等名字空间实现容器间的资源隔离,利用Cgroup实现对容器的资源限制,利用Netlink模块实现内核态进程与用户态进程的进程间通信,利用Selinux、Apparmor等实现安全访问控制,通过Capabilities限制用户进程的权限,最终创建Docker容器。这一系列操作都不需要依赖LXC或其他包。其承接Linux内核与Docker Daemon。屏蔽了Docker上层对容器的直接管理,也让Docker生态在跨平台方面显得更加灵活,未来可能实现以容器为原型的平台出现。