孙宏亮老师指出,假设我们下拉了Ubuntu:14.04映像,并通过命令docker run –it ubuntu:14.04 /bin/bash将其启动运行。则Docker为其创建的rootfs以及容器可读写的文件系统参见下图。从容器的视角来看,虽然只有一个逻辑的完整文 件系统,但该文件系统由“2层”组成,分别为读写文件系统和只读文件系统(按只读层还可以再逻辑分层,所以极大地节省磁盘空间)。
Windows Docker同样如此,顶层的沙盒层(sandbox layer)是可读写的,只允许该容器自己占用,而其他层则是只读的,可供不同容器共享。在下图中,底层的基础OS层和中间的应用程序框架层都是只读的, 而顶层的沙盒层则可读写,在容器的视角看来,它独占了完整的OS。这有点类似于Hyper-V的差异磁盘链。
会话(session)隔离机制,最初是用在Windows终端服务和快速用户切换中,以便这些不同用户的进程不会互相干扰,确保安全。从 Windows Vista开始,也采用这种技术对系统会话进行隔离,Windows系统自己的服务和进程会占用原来的控制台会话(会话0),而后续的用户会依次使用会话 1、会话2等等,这就是我们不能再使用mstsc /console进行控制台登录的原因。
在Taylor的这个演示中,我们也能“察觉”到一些蛛丝马迹。在PID隔离一节的两个任务管理器截图里,从容器的视角来看,可以看到 Process Explorer的运行账户为Administrator,但是从宿主机上查看,对应进程的运行账户为空。所以Windows容器可能也实现了类似的账户 隔离技术(抱歉这只是推测,我们现在还拿不到Windows Docker的测试版本)。