按关键词阅读: 原理 实现 容器 Docker
1、Docker容器原理与实现Docker容器的原理与实现周成玉【摘要】Linux 容器(Linux Container, LXC)是 docker 的核心技术之一LXC利用chrootnamespace和cgroup 等技术实现资源的隔离和配额 , 文章剖析了 LXC的原理 和实现 。
【关键词】chroot, namespace, cgroup, LXC 1、概述海关已经广泛使用虚拟机技术多年 , IT资源利用率得到有效提高 。
近年来 , 基于Docker的轻量级虚拟化 技术正成为IT技术热点之一 。
与传统虚拟机相比,Docker技术本质上是一种LXC引擎 。
VM和LXC关注的 问题都是资源的隔离和配额 , VM采用C 。
2、PU、memory disk 等硬件虚拟化技术 , LCX则借助了 chroot namespace 和cgroups等系统调用 。
2、LXC的资源隔离2 1、chrootchroot (change root directory,更改 root 目录),最早在1979年的Unix V7使用 , 并在各个版本的linux系统中得以保留 。
在linux系统中 , 系统默认的目录结 构都是以“/ , 即根(root)开始的 。
etcredprochomeusrsre通过使用chroot,系统读取到的目录和文件将不在 是旧系统根下的而是指定的新位置下的目录结构和文 件 , 这样带来两个好处:(1)增加系统的安全性 , 限制用户权 。
3、力 。
经过 chroot之后 , 在新根下将访问不到旧系统的根目录结构和文件 , 这样就增强了系统的安全性 。
在登录Gogin) 前使用chroot,阻止用户访问特定目录 。
(2)建立一个与原系统隔离的系统目录结构 , 方便用户的开发 。
使用chroot后 , 系统读取的是新根下 的目录和文件 , 这是一个与原系统根下文件不相关的目录结构 。
在这个新的环境中 , 可以用来测试软件的 静态编译以及一些与系统不相关的独立开发 。
Docker就是利用chroot功能 , 实现每个容器里看 到的文件系统都是一个完整的linux系统 。
下面来看一 个简单shell脚本 , 将某个进程及其子进程访问根目录 限制在“/home/container”目录 。
4、 , 该进程及其子进程 将不能访问linux系统的其他目录 。
先创建目录/home/container,将 bash、1s 和 pwd 三个shell命令及运行这三个命令需要的库复制到对应 目录 。
脚本如下:j=/?iome/container mkdir -pmkdir -p $J/binzlib64I .cp -f /bin/bash,Is,pwd $J/bin(Ida /hin/bash | ogrop -o 1 /lib . * . 0-9 1 ) n for i in $list;
do cp -fdonelist=MS(Idd /bin/ls I egrep -o 1/lib.(0-91) 。
5、u for i in Slist;
do cp -f Si f$ JSiw;
donelisc=M$(Ida /bin/pwd I egrep -o. 0-91)Mfor i in $list;
do cp -fdone执行脚本后 , 在/home下增加了 container文件系统 , 如下图蓝色部分所示:homelibacl.so 1 libcap.so.2 libdi.so.2 librt.so.1 libbnfo.so.5执行 chroot /home/container /bin/bash 后 , 会启动一个bash进程 , 这个进程及其所有子进程对应的 根目录就限制在“/home/containe 。
6、r” , 且对于它们而言, 就认为是自己的根目录 。
执行命令结果如下:rootcentos-l -# chroot /home/container /bin/bash bah二4.1# pwdbash-4.l#pK 太bin:bash Is pwdlib64:ld-linux-x86-64.so.2libattr.so.1libcap.so.2libpthread.so.Olibselinux.so.1libacl.so.1libc.so.6libdl.so.2librt.so.1libtinfo.so.5Bash-4.1年bash-4. If;
clearbash: clear: command。
7、not found由于进程的根(对应物理机系统的/home/container )下面只有bash、pwd和Is三个命令, 子进程不能访问物理机的其他命令 , 所以当执行clear 命令时就会报command not found错 。
可见 , chroot有效地限制了进程访问操作系统文件系统的权限 。
2. 2、 namespaceNamespace是Linux内核功能,用来隔离各种系统资源 , 比如进程树、用户号、网络接口、挂载点等 。
当一台物理机同时运行多个应用时 , 有些用户会访问、修 改或关闭他应用的某些资源 , 这样就会导致各个应用之间互相干扰 。
通过使用Namespace,系统就可以做到各种资源隔离 。
names 。
【Docker|Docker容器原理与实现】8、pace Anamespace Bnamespace建立系统的不同视图(可以理解为简易 容器) , 每个namespace内用户看起来 , 像单独的一台 Linux计算机 , 有自己的init进程(PID为1),其他进 程的PID依次递增 。
如图所示,namespace A和namespace B都有PID为1的init进程 , 子容器的进程映射到父容 器的进程上,父容器可以知道每一个子容器的运行状态, 而子容器与子容器之间是隔离的 。
图中 , 进程3在父命 名空间里面PID为3,但是在namespace A就是1,也就是说namespace A内用户看到的进程3就像init进程一样 , 认为这是自己的初始化进程 , 但是从 。
9、整个操作系 而已 。
统来看,它只是3号进程虚拟化出来的一个namespace当前Linux 一共实现六种不同类型的namespace,分别是 mount、UTS、IPC、PID、network、User 等的隔 离机制 。
稿源:(未知)
【傻大方】网址:/a/2021/0905/0024106853.html
标题:Docker|Docker容器原理与实现