docker采用Go语言编写,而且采用部分linux内核特征实现共功能。docker容器采用沙盒机制,相互之间隔离,不存在访问接口。
一、命名空间 namesapce
docker引擎采用命名空间技术,为容器之间创建隔离层,为每一个容器定义一套不同的命名空间,通过命名空间访问容器每一部分,这就使得容器间相互隔离。docker引擎在linux上使用的命名空间有如下:
pid: 进程隔离(PID:Process ID)
net: 管理网络接口(NET: Networking)
ipc: 管理对内部进程的访问(IPC: InterProcess Communication)
mnt: 管理文件系统挂载点(MNT:mount)
uts: 隔离内核和版本标示符(UTS: Unix Timesharing System)
因此,当我们采用访问进程命名空间方式,进入容器,需要带上上述的命名空间。
yum intall -y nsenter
nsenter --target 进程ID --pid --ipc --mount --net --uts
获取容器ID可通过如下代码
docker inspect -f {{.State.Pid}} <contain_id | contain_name>
二、Control group
采用命名空间,能够将容器隔离,因此容器在使用设备(称为子系统)时,也是按照各容器独立使用,因此多个容器对设备的使用应是互斥的,具有抢占性质,所以需要统一的策略维护容器对子系统的使用。Control group (cgroup)限制应用程序使用指定的设备资源。docker engine可使用cgroup 使容器共享使用子系统资源,同时,也可约束或者限制容器使用特定资源,例如仅限制某个容器所占内存大小。
三、Union File Systems
统一文件系统,又称UnionFS, 是docker 快速创建轻量 镜像层的文件系统。docker engine使用UnionFS为容器提供构建模块。同时docker engine也可使用UnionFS的变体btrfs, vfs, and DeviceMapper等。
四、容器格式
docker 结合namespace, Conrol group, 和UnionFS, 封装成容器的格式,默认称为 libcontainer. 未来,不同格式的容器将被纳入doker中,例如 BSD Jails 和 Solaris Zones.