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 等。

原文地址:https://www.cnblogs.com/canghai1024/p/13629569.html