Update 第一章——Docker.md

This commit is contained in:
benjas 2020-04-04 16:09:38 +08:00
parent a67662a53e
commit 13eb158769

View File

@ -1,10 +1,14 @@
## 第一章——Docker
### Docker容器是怎么隔离的
### 容器是怎么隔离的
我们先说一下**进程**一些数据加上代码本身的二进制文件放在磁盘上就是我们平常所说的一个“程序”也叫代码的可执行镜像executable image一旦“程序”被执行起来,它就从磁盘上的二进制文件,变成了计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。**像这样一个程序运起来后的计算机执行环境的总和,就是:进程。**
**进程**一些数据加上代码本身的二进制文件放在磁盘上就是我们平常所说的一个“程序”也叫代码的可执行镜像executable image
静态的表现是程序,动态的表现是进程,而**容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。**
**程序运起来后的计算机执行环境的总和,就是:进程。**
> “程序”运行起来,就从磁盘上的二进制文件,变成了计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。
静态的表现是程序,动态的表现是进程,**容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。**
**Cgroups 技术**是用来制造约束的主要手段,而**Namespace 技术**则是用来修改进程视图的主要方法。
@ -26,7 +30,7 @@ PID USER TIME COMMAND
10 root 0:00 ps
~~~
> 执行ps指令我们在Docker 里最开始执行的 /bin/sh就是这个容器内部的第 1 号进程PID=1而这个容器里一共只有两个进程在运行。这就意味着前面执行的 /bin/sh以及我们刚刚执行的 ps已经被 Docker 隔离在了一个跟宿主机完全不同的世界当中。
> **注释:**执行ps指令我们在Docker 里最开始执行的 /bin/sh就是这个容器内部的第 1 号进程PID=1而这个容器里一共只有两个进程在运行。这就意味着前面执行的 /bin/sh以及我们刚刚执行的 ps已经被 Docker 隔离在了一个跟宿主机完全不同的世界当中。
**这种技术,就是 Linux 里面的 Namespace 机制**。
@ -36,7 +40,7 @@ PID USER TIME COMMAND
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
~~~
这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1。之所以说“看到”是因为这只是一个“障眼法”在宿主机真实的进程空间里这个进程的 PID 还是真实的数值,比如 100。多次执行上面的clone()调用这样创建多个PID Namespace它们之间也是互相看不见对方的。
这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1。之所以说“看到”是因为这只是一个“障眼法”在宿主机真实的进程空间里这个进程的 PID 还是真实的数值,比如 100。
**除了 PID NamespaceLinux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace用来对各种不同的进程上下文进行“障眼法”操作。**
@ -49,7 +53,9 @@ int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
**这,就是 Linux 容器最基本的实现原理,容器,其实就是一种特殊的进程。**
#### 关于namespace
### 关于namespace
namespace的API包括clone()、setns()以及unshare(),还有/proc下的部分文件。为了确定隔离的到底是哪种namespace在使用这些API时通常需要指定以下六个常数的一个或多个通过|位或操作来实现。这六个参数分别是CLONE_NEWIPC、CLONE_NEWNS、CLONE_NEWNET、CLONE_NEWPID、CLONE_NEWUSER和CLONE_NEWUTS。
@ -117,5 +123,9 @@ unshare命令就是通过unshare()系统调用实现的。
这样的架构也解释了为什么 Docker 项目比虚拟机更受欢迎的原因。
> 虚拟机里面必须运行一个完整的 Guest OS 才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用。
> 虚拟机里面必须运行一个完整的 Guest OS 才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用。一般情况下虚拟机自己就需要占用 100~200 MB 内存。
### 深入理解容器镜像