自己动手写Docker

Docker容器有以下3个特点:

1. 轻量级

2. 开放: Docker 容器基于开放标准,这使得Docker容器可以运行在主流Linux 发行版和Windows操作系统上。

3. 安全

容器包含用户的程序和所有的依赖,但是容器之间是共享Kernel 的。各个容器在宿主机上互相隔离,并且在用户态下运行。

Docker 容器加速开发效率

1. 加速开发:再也不用等待数小时设置开发环境,可以方便地使生产环境的代码在本地跑起来。

2.消除环境不一致。

利用容器合作开发:

Docker镜像 可以储蓄到Docker Hub, Docker Store 中;

利用容器快速扩容:

他可以在需要的时候快速扩容出大量的应用程序,扛住并发的压力。

基础技术

Linux  Namespace 介绍

Linux Namespace 是Kernel 的一个功能,他可以隔离一系列的系统资源,比如 PID, UserID, Network等。

很多人会想到一个命令chroot,就像chroot 允许把当前目录变成根目录一样(被隔离出来);

用途/例子: 一个公司向外界出售自己的计算资源。在公司有一台还不错的服务器,每个用户买一个tomcat 实例来运行他们自己的应用。怎么保证各个客户不会相互干扰。这时候Linux Namespace 就派上用场了。

除了User Namespace ,PID也是可以被虚拟的。从用户的角度来看,每一个命名空间应该像一台单独的计算机一样,有自己的init进程(PID为1)其他进程的PID依次递增。 图 todo;

当前Linux 一共实现了6种不同类型的Namespace。

Mount Namespace ;  UTS Namespace;  IPC Namespace;   PID Namespace;  Network Namespace; User Namespace;

Namespace 的 API 主要使用如下3个系统调用。

clone()  创建新进程

unshare()  将某个进程移除某个Namespace

setns() 将进程加入到Namespace 中。

UTS Namespace  : 主要用来隔离 nodename, domainname 两个系统标识。

IPC Namespace : 用来隔离System V IPC  和 POSIX message queues.

PID Namespace  :是用来隔离进程ID的, 同一个进程 在不同的 PID Namespace 里 可以拥有不同的 PID。 即 在 docker container里边使用ps -ef 经常会发现, 在容器内,前台运行的那个进程PID 是1,在容器外,使用ps -ef 会发现同样的进程 却有不同的PID,这就是PID Namespace 做的事情。

Mount Namespace : 用来隔离各个进程看到的挂载点视图

Network Namespace: 可以让每个容器都有自己独立的网络设备。而且不同容器上的应用可以使用相同的端口。

Linux Cgroups 介绍

构建Linux 容器的Namespace 技术,它帮助进程隔离出自己单独的空间,但Docker是怎么限制每个空间的大小,保证它们不会相互争抢呢? 这就要用到Linux的 Cgroups技术。

Linux Cgroups (Control Groups) 对一组进程及将来的子进程 的资源 进行限制。这些资源包括 CPU, 内存, 储蓄, 网络等。

通过Cgroups 可以方便地限制某个进程的资源占用,并且可以实时地监控和统计进程信息。

Cgroups 中的三个组件:

cgroup    :  将一组进程和一组subsystem 的系统参数关联起来

subsystem  :   

               查看Kernel 支持的 subsystem :  lssubsys -a 

               cpuset, blkio, memory, devices, freezer, perf_event

hierarchy   :  它的功能是把一组cgroup 串成一个树状的结构,一个这样的树便是 一个 hierarchy。 通过这种树结构,Cgroups 可以做到继承。

例如: 系统对一组定时的任务进程通过 cgroup1 限制了 cpu 的使用率, 然后有一个定时dump日志 的进程还需要限制磁盘IO, 就可以创建cgroup2, cgroup2继承cgroup1。

Docker 是如何使用Cgroups 的

Docker 通过为每个容器创建cgroup,并通过cgroup 去配置资源限制和资源监控

Union File System

简称UnionFs,  把其他文件操作系统联合到一个联合挂载点的文件系统服务。这些文件系统是 read-only 或 read-write的,

所以当对这个虚拟的联合文件系统 进行写操作 时候,系统其实是写到了一个新的文件中的。 其中用到了 写时复制(copy-on-write) 思想.

AUFS 英文全称是 Advanced Multi-Layered Unification Filesystem。 AUFS 重写了 早期的 UnionFS 1.x,并且引入了新的功能。

Docker 是如何使用AUFS的。

AUFS 是Docker 选用的第一种存储驱动。

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值