docker 底层实现

传统的虚拟机通过在宿主主机中运行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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值