原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
一位同学曾给我打比方:宿主机就好比一间大房子,docker
把它成了N
个小隔断。在这些小隔断之间,有独立的卫生间、小床、电视...
麻雀虽小,五脏俱全,这个比喻非常的贴切。Linux提供了非常全面的隔离机制,使得每个小隔间互不影响。即使隔壁小间满室春光,我的小房间一样的冷清,对我毫无影响。
Docker能实现这些功能,依赖于chroot
、namespace
、cgroup
等三种老技术
。我们本篇文章,就先聊一下namespace
方面的东西。毕竟隔离是容器的第一要素。
Linux的内核,提供了多达8种类型的Namespace。在这些独立的Namespace中,资源互不影响,隔离措施做的非常好。
1. 8种类型
我们先来看一下,Linux都支持哪些Namespace。可以通过unshare
命令来观察到这些细节。在终端执行man unshare
,将会出现这些Namespace的介绍。
-
Mount( mnt
) 隔离挂载点 -
Process ID ( pid
) 隔离进程 ID -
Network ( net
) 隔离网络设备,端口号等 -
Interprocess Communication ( ipc
) 隔离 System V IPC 和 POSIX message queues -
UTS Namespace( uts
) 隔离主机名和域名 -
User Namespace ( user
) 隔离用户和用户组
另外,Linux在4.6版本,5.6版本,分别加入了cgroups和Time两种隔离类型,加起来就有8种。
-
Control group (cgroup) Namespace 隔离 Cgroups 根目录 (4.6版本加入) -
Time Namespace 隔离系统时间 (5.6版本加入)
2. 1个例子
通过unshare
命令,可以快速建立一些隔离的例子,我们拿最简单直观的pid namespace
来看一下它的效果。
众所周知,Linux进程号为1
的,叫做systemd
进程。但在Docker中,我们通过执行ps
命令,却只能看到非常少的进程列表。
执行下面的命令,进入隔离环境,并将bash作为根进程:
unshare --pid --fork --mount-proc /bin/bash
效果如图所示。可以看到,我们的bash,已经成为了1号进程,而宿主机和其他隔离环境的进程信息,在这里是不可见的。
先在隔离环境中,执行sleep 1000
。再开一个终端,在宿主机上执行pstree
,我们将会看到这个隔离环境的进行信息。
接下来,在宿主机上,把sleep对应进程的命名空间信息,和宿主机的命名空间信息作一下对比。可以看到,它们的pid namespace
,对应的数值是不同的。
下面给出其他namespace的实验性命令,你可以实际操作一下。
3. 试验一下
unshare --mount --fork /bin/bash
创建mount namespace
,并在每个不同的环境中,使用不同的挂载目录。
unshare --uts --fork /bin/bash
uts可以用来隔离主机名称,允许每个namespace拥有一个独立的主机名,你可以通过hostname
命令进行修改。
unshare --ipc --fork /bin/bash
IPC Namespace 主要是用来隔离进程间通信的。Linux的进程间通信,有管道、信号、报文、共享内存、信号量、套接口等方式。使用了IPC命名空间,意味着跨Namespace的这些通信方式将全部失效!不过,这也正是我们所希望的到的。
unshare --user -r /bin/bash
用户命名空间,就非常好理解了。我们可以在一个Namespace中建立xjjdog账号,也可以在另外一个Namespace中建立xjjdog账号,而且它们是相互不影响的。
unshare --net --fork /bin/bash
net namespace
,这个就非常有用了。它可以用来隔离网络设备、IP 地址和端口等信息。
End
可以看到,通过各种Namespace,Linux能够对各种资源进行精细化的隔离。Docker本身也是一个新瓶装旧酒
的玩具。Docker的创新之处,在于它加入了一个中央仓库,并封装了很多易用的命令。
你可能会发现,到目前为止,我们并没有对Cpu和内存的资源使用进行隔离,也没有对应的Namespace来解决这些问题。
资源限制的功能,是使用Cgroups
进行限额配置来完成的,和Namespace
没什么关系。我们将在后面的文章,介绍Cgroups这项技术。
最后,附上Docker的一张生命周期图。来源(http://docker-saigon.github.io/post/Docker-Internals/ )。有需要的同学可以加我的好友获取。
Docker发展到现在,应用工具链已经非常成熟了,很多同学已经驾轻就熟,如果你对容器技术非常感兴趣,不如多看一下最底层的原理。这样,不管是谷歌推自己的容器,还是继续使用docker,都能快速把它掌握。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。
推荐阅读:
一图解千愁,jvm内存从来没有这么简单过!
失联的架构师,只留下一段脚本
架构师写的BUG,非比寻常
nginx工程师,需要上承天命,下召九幽
实力解剖一枚挖矿脚本,风骚操作亮瞎双眼
又一P1故障,锅比脸圆
传统企业的人才们,先别忙着跳“互联网”!
面试官很牛,逼我尿遁
又一批长事务,P0故障谁来背锅?
一天有24个小时?别开玩笑了!
《程序人生》杀机!
可怕的“浏览器指纹”,让你在互联网上,无处可藏
2w字长文,让你瞬间拥有「调用链」开发经验
996的乐趣,你是无法想象的
作为高级Java,你应该了解的Linux知识(非广告)
必看!java后端,亮剑诛仙(最全知识点)
学完这100多技术,能当架构师么?(非广告)
Linux上,最常用的一批命令解析(10年精选)
数百篇「原创」文章,助你完成技术「体系化」
本文分享自微信公众号 - 小姐姐味道(xjjdog)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/3897601/blog/4934079