论文部分内容阅读
摘 要:简要介绍了docker容器的核心技术namespace和cgroup,以及实现容器隔离的方法。
关键词:Docker;namespace;cgroup;虚拟化;linux
Docker当前的定义是一个开源的容器引擎,可以方便地对容器进行管理,封装整个软件的运行环境,为开发者和系统管理者提供用于开发、设计、构建、测试、发布、运行的应用平台。得益于其轻量级的虚拟化,以及分层镜像应用,Docker在磁盘、性能和效率上比传统虚拟化有明显的优势。
Docker容器的核心技术就是namespace和cgourp,Docker本身就是软件,其本质就是主机上的进程,它通过linux内核提供的namespace功能实现了资源的隔离,通过cgroup实现了资源的限制。Namespace隔离有6种,分别是UTS(主机名)、IPC(内部进程通信)、PID(进程号)、Network(网咯设备、端口等)、Mount(挂载点)、User(用户)。通过namespace,可是使得不同容器里的进程置于一个独立的系统运行环境里,不能互相感知到,达到了隔离的目的。最常用的namespace的API就是clone(),通过clone()方法,可以在创建新进程的同时创建namespace,代码如下:
#define _GUN_SOURCE
#include
#include
#include
#include
#define STACK_SIZE(1024 * 1024)
static char stack[STACK_SIZE];
static char* const child_args[]={"/bin/bash",NULL};
static int child(void *arg){
printf("in sub process!\n");
execv("/bin/bash",child_args);
return 0;
}
int main(){
printf("start\n");
pid_t pid;
pid=clone(child,stack+STACK_SIZE,SIGCHLD|CLONE_NEWUTS,NULL);
waitpid(pid,NULL,0);
printf("quit\n");
return 0;
编译运行后如下图:
Hostname已经改成yj了,但是我们在原终端中可以看到如图:
同时我们退出程序后,结果如图:
Hostname并没有改变,这就是uts namespace隔离起作用了。
我们只要在clone函数的flags参数中,加入CLONE_NEWIPC、CLONE_NEWPID、CLONE_NEWNET、CLONE_NEWUSER,就可以创建新的namespace隔离,
当我们添加了ipc标志位后,执行程序,在子进程中,建立一个ipc消息队列:
如图:
在原终端中我们可以看到如图:
没有任何消息队列,所以也实现了ipc的隔离。
同理,当我们添加pid标记位后,运行刚才的程序后,在子进程中输入echo $$后,显示的进程号显示为1。如下图:
Docker的网络隔离,主要提供了网络资源的隔离、包括网卡、ip协议栈、套接字等。容器是通过建立一个veth pair,一端连接在docker容器中,另一端连接在宿主机安装完docker后生成的一块叫做docker0的网卡上面,来实现容器间的通信,docker0相当于一个二层交换机。
Docker容器的另一个核心技术就是cgroup,它是linux内核提供的一个特性,用于限制和隔离进程对系统资源的使用,包括cpu、内存、block I\O和网络带宽,它包含9子系统,有blkio:负责块设备的输入输出控制,比如硬盘、usb等,cpu:控制cpu的使用,cpuset:分配制定的cpu和内存节点,cpuacct:统计cpu资源的使用情况,device:控制设备的访问权限,memory:设定内存的使用限定,并生成报告。Freezer:可以挂起或恢复cgroup中的进程。perf_event:允许perf工具基于cgroup分组进行统一的性能测试。net_cls:限制网络带宽。Linux中cgroup的实现形式就是通过文件系统提供,是一种虚拟的文件系统,
如下图:
通过/sys/fs/cgroup/目录下各个子系统的配置文件,对各种资源来进行管理,对不同的系统资源,cgourp提供提供统一的接口,当容器中的任务运行时使用某些资源的时候,就会触发cgroup各子系统上的检测程序,根据资源类别的不同,使用不同的方法对资源进行控制。
Docker正是借助于namespace和cgroup这两给linux的内核特性,实现了资源的隔离和限制,docker和容器完美的结合,将带来一次巨大的计算机技术革命。
参考文献
[1]高飞,李勇.Docker容器资源管控配置实战[J].程序员,2014,(9):96-101.
[2]刘思尧,李强,李斌.基于Docker技术的容器隔离性研究[J].软件,2015,36(4):110-113.
(作者单位:常州开放大学)
关键词:Docker;namespace;cgroup;虚拟化;linux
Docker当前的定义是一个开源的容器引擎,可以方便地对容器进行管理,封装整个软件的运行环境,为开发者和系统管理者提供用于开发、设计、构建、测试、发布、运行的应用平台。得益于其轻量级的虚拟化,以及分层镜像应用,Docker在磁盘、性能和效率上比传统虚拟化有明显的优势。
Docker容器的核心技术就是namespace和cgourp,Docker本身就是软件,其本质就是主机上的进程,它通过linux内核提供的namespace功能实现了资源的隔离,通过cgroup实现了资源的限制。Namespace隔离有6种,分别是UTS(主机名)、IPC(内部进程通信)、PID(进程号)、Network(网咯设备、端口等)、Mount(挂载点)、User(用户)。通过namespace,可是使得不同容器里的进程置于一个独立的系统运行环境里,不能互相感知到,达到了隔离的目的。最常用的namespace的API就是clone(),通过clone()方法,可以在创建新进程的同时创建namespace,代码如下:
#define _GUN_SOURCE
#include
#include
#include
#include
#define STACK_SIZE(1024 * 1024)
static char stack[STACK_SIZE];
static char* const child_args[]={"/bin/bash",NULL};
static int child(void *arg){
printf("in sub process!\n");
execv("/bin/bash",child_args);
return 0;
}
int main(){
printf("start\n");
pid_t pid;
pid=clone(child,stack+STACK_SIZE,SIGCHLD|CLONE_NEWUTS,NULL);
waitpid(pid,NULL,0);
printf("quit\n");
return 0;
编译运行后如下图:
Hostname已经改成yj了,但是我们在原终端中可以看到如图:
同时我们退出程序后,结果如图:
Hostname并没有改变,这就是uts namespace隔离起作用了。
我们只要在clone函数的flags参数中,加入CLONE_NEWIPC、CLONE_NEWPID、CLONE_NEWNET、CLONE_NEWUSER,就可以创建新的namespace隔离,
当我们添加了ipc标志位后,执行程序,在子进程中,建立一个ipc消息队列:
如图:
在原终端中我们可以看到如图:
没有任何消息队列,所以也实现了ipc的隔离。
同理,当我们添加pid标记位后,运行刚才的程序后,在子进程中输入echo $$后,显示的进程号显示为1。如下图:
Docker的网络隔离,主要提供了网络资源的隔离、包括网卡、ip协议栈、套接字等。容器是通过建立一个veth pair,一端连接在docker容器中,另一端连接在宿主机安装完docker后生成的一块叫做docker0的网卡上面,来实现容器间的通信,docker0相当于一个二层交换机。
Docker容器的另一个核心技术就是cgroup,它是linux内核提供的一个特性,用于限制和隔离进程对系统资源的使用,包括cpu、内存、block I\O和网络带宽,它包含9子系统,有blkio:负责块设备的输入输出控制,比如硬盘、usb等,cpu:控制cpu的使用,cpuset:分配制定的cpu和内存节点,cpuacct:统计cpu资源的使用情况,device:控制设备的访问权限,memory:设定内存的使用限定,并生成报告。Freezer:可以挂起或恢复cgroup中的进程。perf_event:允许perf工具基于cgroup分组进行统一的性能测试。net_cls:限制网络带宽。Linux中cgroup的实现形式就是通过文件系统提供,是一种虚拟的文件系统,
如下图:
通过/sys/fs/cgroup/目录下各个子系统的配置文件,对各种资源来进行管理,对不同的系统资源,cgourp提供提供统一的接口,当容器中的任务运行时使用某些资源的时候,就会触发cgroup各子系统上的检测程序,根据资源类别的不同,使用不同的方法对资源进行控制。
Docker正是借助于namespace和cgroup这两给linux的内核特性,实现了资源的隔离和限制,docker和容器完美的结合,将带来一次巨大的计算机技术革命。
参考文献
[1]高飞,李勇.Docker容器资源管控配置实战[J].程序员,2014,(9):96-101.
[2]刘思尧,李强,李斌.基于Docker技术的容器隔离性研究[J].软件,2015,36(4):110-113.
(作者单位:常州开放大学)