mirror of
https://github.com/ben1234560/k8s_PaaS.git
synced 2025-04-21 15:25:52 +08:00
Update 第一章——Docker.md
This commit is contained in:
parent
a67662a53e
commit
13eb158769
@ -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 Namespace,Linux 操作系统还提供了 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 内存。
|
||||
|
||||
|
||||
|
||||
### 深入理解容器镜像
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user