1、LXC 依赖什么技术实现容器化?
主要依赖:Namespace,cgroups,Capbility、SELinux、Chroots,UnionFS、IPTABLES等。
Linux底层的容器化,主要依赖两个内核功能来维持。命名空间和cgroup。
- 通过Namespace实现对各种资源的隔离(比如隔离pid,两个不同的命名空间之前,无法互相查看到pid)
- 【通过命名空间,并不能达到KVM/虚拟化那样的完全资源隔离。】
- 通过cgroups实现资源限制/控制/配额,cpu,内存,网络等计算资源进行控制。(比如限制某个进程的cpu使用上限)
Capability与权限控制相关,SELinux做安全隔离,IPTABLES实现端口映射和NAT(比如容器间互相访问等)。
chroot(pivot_root) 系统级别切换rootfs,目录隔离。UnionFS 和Docker镜像分层相关,可以将相关层合并挂载。
参考:
[lxc] https://linuxcontainers.org/lxc/introduction/
[lxc] https://www.cnblogs.com/kinwin/archive/2013/01/14/2859393.html
[chroot pivot_root] https://www.jianshu.com/p/46791cbbb48a
https://www.cnblogs.com/feisky/p/4105739.html
http://www.178linux.com/104355
2、Docker 底层使用了什么技术?基本架构如何? runc是什么?
2.1、Docker底层技术
早期Docker也是用LXC(Linux Container)做底层,所以LXC中使用到的技术,Docker基本也都使用了。
namespace,cgroup,chroot,UnionFS都用到了。【前两个是内核特性】
- namespace:用于资源隔离,通过使用独立的namespace来实现进程隔离,网络隔离,挂载隔离(文件隔离)等。
- cgroup:用于资源限制,对一组进程的cpu/内存/网络/IO等资源进行分配限制。
- UnionFS:AUFS是一种联合文件系统(UnionFS),可以将多个目录合并 再mount到一个目录上。DockerFile 镜像分层结构具体就是利用了AUFS的特性。每一层都是一个目录。镜像的构建过程可以简单理解为将多个目录进行合并【Docker支持众多UnionFS,AUFS只是其中一种。】
参考:
[namespace] https://coolshell.cn/articles/17010.html
[cgroup] https://coolshell.cn/articles/17049.html
[aufs] https://coolshell.cn/articles/17061.html
https://segmentfault.com/a/1190000016357628
http://dockone.io/article/2941
2.2、docker基础架构:
Docker 是一种软件平台,是容器的操作系统,在基础设施和宿主操作系统之上。可以管理、控制容器。
【Docker由服务端和客户端组成,这里Docker指的是Docker Deamon 或者说服务端/Docker守护进程】
从Docker自身来看,主要分为docker守护进程(服务端),REST API,和docker CLI(客户端)。
客户端通过API连接服务端,服务端创建并管理如下功能:
- 存储管理(data volumes)
- 网络管理(docker network)
- 容器运行时(containered)
- 镜像相关(eg: image build. Etc.)
换一个角度来看(将存储和网络暂时忽略),就可以更清楚看清docker的架构:
- docker守护进程控制管理容器、同时也管理镜像和仓库。
- docker CLI(客户端)使用命令和守护进程交互。【docker命令行可以远程操控服务端】
参考:
https://docs.docker.com/get-started/overview/
2.3、其他知识
Docker --> containerd --> docker shim --> runC(libcontainer):
containerd是Docker的容器运行时(rumtime) https://containerd.io/
【containerd一个完整的运行时,可以独立运行。不依赖docker deamon,使用grpc与上层交互。
【主要负责镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)
runC是按照OCI进行的一个容器运行时的具体实现。 https://github.com/opencontainers/runc
【刚开始用的libcontainer,后来将其移交给OCI组织,现在是runc的子项目。】
【同时,runc是在libcontainer的基础上进化来的,而且后续会用runc替代前者作为容器的runtime】
参考:
https://book.51cto.com/art/201710/554421.htm
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。