docker进阶与实战 2 关于容器技术-阿里云开发者社区

开发者社区> 云原生> 正文
登录阅读全文

docker进阶与实战 2 关于容器技术

简介: 2.1 容器技术     2.1.1 关于容器技术         容器技术是轻量级的操作系统虚拟化.         容器技术在linux内核原生集成.         容器主要使用2大linux内核特性:             Cgroup:资源控制        ...
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)设计哲学.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云原生
使用钉钉扫一扫加入圈子
+ 订阅

云原生时代,是开发者最好的时代

其他文章