![6ce5ea9ecd743eb955c86c451c80f6f8.png](https://i-blog.csdnimg.cn/blog_migrate/df5a40a93b45b1bf8dc7a3215108c975.jpeg)
众所周知docker的容器是使用的虚拟化的技术
虚拟化:就是硬件的资源分割,当然硬件资源分割也是分为解耦状态以及半解耦状态,
看下面这张图
![7843fd1a633c07d898c003933e3fe4af.png](https://i-blog.csdnimg.cn/blog_migrate/6e7b6274e9571c890c1a284085325d5f.jpeg)
解耦状态: 所有东西都没有重复,任何东西都没有公用的地方。
半解耦状态:有部分共同的一起用,其他的独立
完全解耦状态: 就是各自都是独立没有重复。
看这张图Hypervisor是一个建立在主机之上的一个虚拟机他的内存和cpu还有各种的硬件都是独立的,再看docker这边他是一个直接建立在主机上的一个app
docker是属于半解耦的
(1)docker程序和物理机公用驱动程序和lib库文件,还有可能共同使用一个文件,如在docker开一个nginx,那么物理机也开一个,但是在内存里只会有一个nginx文件,所以他们共同使用一个文件。
(2)docker是一个文件夹,将所以驱动程序做个软连接,然后将物理机的东西都连接进去,把目录结构也放进去,将物理机都连接进去,叫bootfs,bootfs物理机提供的。
(3)docker 是物理机公用一个内核,只要有bootfs和rootfs 就可以直接在这个容器里装软件了,这个软件就会以为这是一个系统,有lib库,有驱动程序,各种目录结构,而系统会认为这就是一个文件夹,这种状态叫半解耦。可以安装其他的系统,但并不是整个的系统。
(4)半解耦状态:内存里共生的东西都会共用。 解耦状态:就是所有的虚拟机都不会产生冲突,有自己单独的体系。
docker的那些硬件资源需要完全耦呢?
docker存在的目的:就是在一个系统里运行相同的程序。
PID: id
UTS:主机名和域名
IPC:信号量/消息列队/共享内存(可以共同读内存,不能共同写)
NET:网络设备/网络栈/端口等 NS: 挂载点(文件系统)
USER: 用户和组
bug: 权限不能隔离。
同一个程序想在一起运行的时候就放在相同的一个命名空间里且没有冲突 可以起别名,上边的几项值没有冲突,自己是唯一,就可以共同运行。
namespace:(命名空间) 想让两个程序共同工作,就要放在同一个空间里,且没有冲突,以上的6项没有冲突。 空间范围怎么看,看编号,如果编号都一样,说明在一个空间范围工作,如果不一样就说明被隔离了
下面我来做一下隔离
写一个小型的脚本
![850709e703a5f055c64874d7c6a1428d.png](https://i-blog.csdnimg.cn/blog_migrate/9b1582f69a31399caa4ab7cae16e0e14.jpeg)
隔离name
![6e3551b026b1c828c59c61aaaa5e5baa.png](https://i-blog.csdnimg.cn/blog_migrate/d2fde78cb64e87537592086a20443774.png)
![2b426d5c8646509b3a689aa48d29012d.png](https://i-blog.csdnimg.cn/blog_migrate/2ebc40e7f4e9eb831312b3c95f8af87f.png)
再执行./ust.o
hostname
exit
hostname
隔离ipc
![2d6e79dea1e7b6666074cef62b1827fa.png](https://i-blog.csdnimg.cn/blog_migrate/529c29539c4dc2ae24f900997fe90b60.png)
![3b78156df84c4b547ca7343daacf8ead.png](https://i-blog.csdnimg.cn/blog_migrate/dbbcfd24c3e83aa648b14c908982084a.png)
![8fee192c4902245af6d8bb6a3e858303.png](https://i-blog.csdnimg.cn/blog_migrate/ef1412a2c15418560519558fdbb4a8e8.png)
![6165737b22e48c571564fcd549420569.png](https://i-blog.csdnimg.cn/blog_migrate/34807665b1f85972c3b6ac5ac30e7b29.png)
隔离进程
![13061c5507e0ce19c733e9fc7b313f3c.png](https://i-blog.csdnimg.cn/blog_migrate/8ede53641fb724151ff8d428ae17e5d2.png)
![44c0eb2953b4b302d4fd966b3461f389.png](https://i-blog.csdnimg.cn/blog_migrate/6dd213efb643de829633e42beba1a7ed.png)
当然使用Namespace隔离有缺点
最大的缺点就是隔离不彻底
1)容器运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核
2)在Linux内核中,有很多资源和对象是不能被Namespace化的
举个例子:时间,即如果某个容器修改了时间,那整个宿主机的时间都会随之修改
3)容器给应用暴露出来的攻击面比较大,在生产环境中,没有人敢把运行在物理机上的Linux容器暴露在公网上
那么接下来就需要使用更强大的工具Cgroup