zoukankan      html  css  js  c++  java
  • 容器技术之Chroot&Docker

    chroot

    容器技术从1979年chroot的首次问世便已崭露头角。

    维基百科对chroot的定义如下:

    是在 Unix 和 Linux 系统的一个操作,针对正在运行的软件进程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由 chroot 设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。

    通俗地说 ,chroot 就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录,这个跟我们在一个容器中是很相似的。下面我们通过一个实例来演示下 chroot。

    chroot实例说明:

    1)、mkdir rootfs 

    #在当前目录下创建一个名称为:rootfs 的目录

    2)、cd rootfs 

    #进入目录名称为:rootfs 目录下

    3)、docker export $(docker create docker101tutorial) -o docker101tutorial.tar
    #将容器名为:docker101tutorial的文件系统作为一个docker101tutorial.tar归档文件导出到docker101tutorial.tar中并保存

    #也可以简单理解为在rootfs下创建了一些目录和放置了一些二进制文件

    4)、tar -xf docker101tutorial.tar

    #解压docker101tutorial.tar文件内容

    5)、ls 

    #查看当前 rootfs 目录下的文件内容

    6)、chroot /Users/xiaoqin.wu/rootfs /bin/sh

    #启动一个sh 进程,并且把 /Users/xiaoqin.wu/rootfs 作为sh 进程的根目录

    图片

    图片

    对比上图中命令5:ls查看/Users/xiaoqin.wu/rootfs目录下文件内容的结果与在sh进程中使用命令7:ls查看当前进程的结果是一致,至此,说明使用chroot实现了当前进程与主机的隔离,一个目录隔离的容器就完成了,但是还不能称之为一个容器。

    原因如下:
    使用命令8:netstat -nr查看路由信息

    图片

    由结果发现,网络信息并未隔离,实际上进程等信息此时也并未隔离,要想实现一个完整的容器,需要Linux的其他三项技术来实现,分别是:

    • Namespace

    • Cgroup

    • 联合文件系统

    Docker

    2013年,Docker的横空出世使得容器技术迅速发展

    Docker是利用Linux的Namespace、Cgroup、联合文件系统三大机制来保证实现的。

    原理如下:

    Namespace:

    是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。

    Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源。

    Docker 主要用到以下五种命名空间。

    图片

    pid namespace:用于隔离进程 ID。

    net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等。

    mnt namespace:文件系统挂载点隔离。

    ipc namespace:信号量,消息队列和共享内存的隔离。

    uts namespace:主机名和域名的隔离。

    Cgroups:

    是一种 Linux 内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘 I/O、网络等)。在容器的实现中,Cgroups 通常用来限制容器的 CPU 和内存等资源的使用。

    联合文件系统:

    用于镜像构建和容器运行环境。

    联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等。

    从1973年chroot的出现至2013年,因为Docker加入了镜像功能,并且封装了镜像仓库使得镜像分发更加方便。因此在2013年Docker最终爆发,成为容器技术的代表。

    欢迎关注【无量测试之道】公众号,回复【领取资源】,
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

     添加关注,让我们一起共同成长!

  • 相关阅读:
    伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra
    不要什么都学-打造自己的差异化价值
    gitlab markdown支持页面内跳转
    技术人员怎样提升对业务的理解
    为什么HDFS的副本数通常选择3?
    MySQL++简单使用记录.md
    log4cpp安装使用
    log4cxx安装使用
    epoll使用总结
    工作方法-scrum+番茄工作法
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/14349439.html
Copyright © 2011-2022 走看看