Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1817921
  • 博文数量: 276
  • 博客积分: 1574
  • 博客等级: 上尉
  • 技术积分: 2894
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-26 23:23
个人简介

生活的美妙在于,不知道一下秒是惊艳还是伤神,时光流转,珍惜现在的拥有的时光

文章分类

全部博文(276)

文章存档

2017年(17)

2016年(131)

2015年(63)

2013年(2)

2012年(32)

2011年(31)

分类: 虚拟化

2016-03-03 11:49:20

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)设计哲学.
阅读(1358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~