Docker 特性与原理
首先看看Docker提供了哪些特性:
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell
文件系统隔离:每个进程容器运行在完全独立的根文件系统里
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置
从以上特性分别看实现原理
1. 交互式Shell
首先我们允许一个交互式的容器
$docker run -i -t <image name> /bin/bash
这样就建立了一个到容器内的交互式连接,看到的是如下的命令行:
root@df3880b17407:/#
这里我们启动了一个容器,以bash作为其根进程.
root@df3880b17407:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 18164 2020 ? S 06:06 0:00 /bin/bash可以看到,在这个容器中,bash 的 PID为 1,而实体机平常情况下,是这样的:
root@ubuntu:~# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 24716 2612 ? Ss Sep04 0:01 /sbin/init大家都知道,所有进程的共同祖先都是 PID=1的进程
所以在容器中,所有以后创建的进程都是通过/bin/bash 创建的,PID=1的 bash是容器中所有进程的祖先理解了这点后,对容器的理解就很简单了.
2. 文件系统隔离
对于一个正在运行的容器,其文件系统都是一个从根目录开始的虚拟文件系统,在容器中看到的是这样的:
root@df3880b17407:/# ll /
total 68
drwxr-xr-x 2 root root 4096 Jul 22 22:51 bin
drwxr-xr-x 2 root root 4096 Apr 10 22:12 boot
drwxr-xr-x 3 root root 4096 Jul 22 22:49 dev
drwxr-xr-x 85 root root 4096 Sep 5 06:49 etc
drwxr-xr-x 2 root root 4096 Apr 10 22:12 home
drwxr-xr-x 16 root root 4096 Jul 22 22:50 lib
drwxr-xr-x 2 root root 4096 Aug 12 03:30 lib64
drwxr-xr-x 2 root root 4096 Jul 22 22:48 media
drwxr-xr-x 2 root root 4096 Apr 10 22:12 mnt
drwxr-xr-x 2 root root 4096 Jul 22 22:48 opt
dr-xr-xr-x 356 root root 0 Sep 5 06:06 proc
drwx------ 2 root root 4096 Jul 22 22:51 root










