2.1 容器技术
2.1.1 关于容器技术
容器技术是轻量级的操作系统虚拟化.
容器技术在linux内核原生集成.
容器主要使用2大linux内核特性:
Cgroup:资源控制
NameSpace:访问隔离
Cgroup与Namespace两种技术并不强相关,可以单独使用.同时使用时就创建了一个容器.
2.1.2 容器技术的历史
文件系统隔离:chroot(不安全)=>pivot_root(安全加强,目前在用)
容器:virtuozzo=>OpenVZ=>Cgroup,NameSpace(docker让容器技术获得世界的关注)
NameSpace: 使用3个系统调用:clone,setns,unshare
Mount
UTS
IPC
PID
Net
User
Cgroup: 使用cgroupfs虚拟文件系统,标准挂载点 /sys/fs/cgroup
cpuset
CPU
memory
device
freezer
blkio
net cls
hugetlb ...
2.2 一分钟理解容器
2.2.1 容器的组成
容器=namespace+cgroup+rootfs+容器引擎(用户态工具)
访问隔离+资源控制+文件系统隔离+生命周期控制
2.2.2 容器的创建原理
clone namespace=>cgroup=>pivot rootfs=>执行命令
2.3NameSpace
2.3.1namespace对内核全局资源做封闭,每个namespace都有独立资源,不同进程在各自的namespace中调用同一资源互不干扰.
NameSpace 6大组件:
IPC: 隔离system V IPC和posix消息队列(IPC用到了标识符)
Mount: 隔离文件系统
UTS: 隔离主机名和域名
PID: 隔离进程ID
Net: 隔离网络资源
User: 隔离用户ID和组ID
2.3.2 namespace的接口和使用
操作:
clone(创建新),
unshare(为旧进程创建新namespace),
setns(将旧进程放入新namespace)(docker exec的实现原理就是setns)
pid=clone(flags,...)
(flags:CLONE_NEWNS(这个是mount namespace),CLONE_NEWIPC,CLONE_NEWPID,CLONE_NEWUSER,CLONE_NEWUTS,CLONE_NEWNET,) 新进程创建出来的子进程也使用这个namespace
setns通过procfs(/proc/$$/ns)指定namespace信息
2.4 Cgroup(control group)
组件: 之前只能使用ulimit对单一进程时行控制
devices: 设备权限控制
cpuset: 分配指定CPU和内存节点(避免进程跨节点访问CPU内存导致性能下降)
CPU: 控制CPU占有率
cpuacct: 统计CPU使用情况
memory: 控制内存使用上限
freezer: 冻结或暂停Cgroup中的进程
net_cls: 配合tc限制网络流量
net_prio: 设置进程网络流量优先级
huge_tlb: 限制hugeTLBr使用.
perf_event: 允许perf基于cgroup做性能监测
systemd默认使用cgroupfs
[root@220 ~]# ls -l /sys/fs/cgroup/
total 0
drwxr-xr-x 2 root root 0 Jan 11 18:00 blkio
lrwxrwxrwx 1 root root 11 Jan 11 18:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jan 11 18:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 2 root root 0 Jan 11 18:00 cpu,cpuacct
drwxr-xr-x 2 root root 0 Jan 11 18:00 cpuset
drwxr-xr-x 4 root root 0 Jan 11 18:00 devices
drwxr-xr-x 2 root root 0 Jan 11 18:00 freezer
drwxr-xr-x 2 root root 0 Jan 11 18:00 hugetlb
drwxr-xr-x 2 root root 0 Jan 11 18:00 memory
drwxr-xr-x 2 root root 0 Jan 11 18:00 net_cls
drwxr-xr-x 2 root root 0 Jan 11 18:00 perf_event
drwxr-xr-x 4 root root 0 Jan 11 18:00 systemd
直接操作namespace,cgroup还是有点难的,但docker通过libcontainer很容易搞定这些复杂的操作
2.5容器造就docker
容器是docker核心技术之一.
微服务(micro service)设计哲学.
阅读(1388) | 评论(0) | 转发(0) |