Docker学习一:简单理解docker技术原理
备注:学习素材来源于拉钩教育课程:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=455#/detail/pc?id=4572
一、雏形chroot
首先了解下docker最早的雏形chroot:
chroot是在unix系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。
通俗的说,chroot可以限制程序运行的根目录,使之不能访问其他目录。
通过如下命令创建一个模拟的系统:
mkdir rootdfs
cd rootfs
docker export $(docker create busybox) -o busybox.tar
tar -xf busybox.tar
查看rootdfs目录下文件:
使用以下命令,可以启动一个 sh 进程,并且把 /data/rootfs 作为 sh 进程的根目录
# chroot /data/rootfs /bin/sh
进入sh进程后执行/bin/ls命令查看文件,可以发现文件已经和主进程隔离:
继续执行/bin/ip route命令,可以看到还是共享的主机的网络,也就是并未实现完整的隔离:
二、Docker容器原理
Docker 主要是利用 Linux 的 Namespace 、Cgroups 和联合文件系统三大机制来保证实现:
1、使用 Namespace 做主机名、网络、PID 等资源的隔离,其中docker主要用到的命名空间:
- pid namespace:用于隔离进程 ID。
- net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等。
- mnt namespace:文件系统挂载点隔离。
- ipc namespace:信号量,消息队列和共享内存的隔离。
- uts namespace:主机名和域名的隔离。
2、使用 Cgroups 对进程或者进程组做资源(例如:CPU、内存等)的限制
3、使用联合文件系统用于镜像构建和容器运行环境
是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等。