传统的虚拟机通过在宿主主机中运行hyperviso来模拟一套完整的硬件环境提供给虚拟机的操作系统,这种的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。随着Linux系统对于名字空间功能的完善,让某些进程在彼此隔离的名字空间中运行,大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却都看不到,都以为系统中只有自己的存在,这种机器就是容器。
- 基本架构
Docker采用了C/S架构,包括客户端和服务端。Docker daemon作为服务端接受来自客户的请求,并处理这些请求。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信。
- 名字空间
名字空间是Linux内核一个强大的特性,每个容器都有自己的名字空间。
(1)pid名字空间
不同用户的进程就是通过pid名字空间隔离的,且不同名字空间中可以有相同pid。所有LXC进程在Docker中的父进程为Docker进程,每个LXC进程具有不同的名字空间。
(2)net名字空间
网络隔离是通过net名字空间实现的,每个net名字空间有独立的网络设备、IP地址、路由表、/proc/net目录。这样每个容器的网络就能隔离开来,Docker默认采用奶片
的方式,将容器中的虚拟网卡同host上的一个Docker网桥docker0连接在一起。
(3)ipc名字空间
容器中进程交互还是采用 Linux常见的进程间交互方法(interprocess communication- IPC),包括信号量、消息队列和共享内存等。每个IPC资源有一个唯一的32位id。
(4)mnt名字空间
允许不同名字空间的进程看到的文件结构不同,这样每个名字空间中的进程所看到的文件目录就被隔离开发。
(5)uts名字空间
Unix Time-sharing System名字空间允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
(6)user名字空间
每个容器可以有不同的用户和组id,也就是说可以在容器内部的用户执行程序而非主机上的用户。
- 控制组
cgroups是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时对系统资源的竞争。
- union文件系统
它是种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交一层层的叠加,同时将不同目录挂载一同一个虚拟文件系统下。Unio文件系统是Docker的镜像的基础,Docker中使用的AUFS(AnotherUnionFS)就是一种 Union FS。Docker目前支持的Union文件系统种类包括AUFS、btrfs、vfs和DeviceMapper。
- 容器格式
Docker采用了LXC中的容器格式,支持新的libcontainer格式(默认)。
- Docker网络实现
Docker的网络实现其实就是利用了Linux上的网络名字空间和虚拟网络设备。
Docker中的网络接口默认都是虚拟的接口,Linux通过在内核中进行数据复制来实现接口之间的数据转发,对于本地系统和容器内系统看来说就像一个正常的以太网卡,只是它不需要真正的同外部 网络设备通信。Docker容器网络就利用了这项技术,它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做veth pair)。
最后欢迎大家访问我的个人网站:1024s