做网站不懂行情 怎么收费,国外专门做童装的网站,环保局 网站建设,免费下载建筑图集规范的网站版权声明#xff1a;本文为博主原创文章#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/46290985 Container技术#xff1a; 传统的虚拟化技术#xff1a; 通过对硬件层模拟#xff0c;从而实现了能够在一套硬件上面运行多个操作… 版权声明本文为博主原创文章未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/46290985 Container技术 传统的虚拟化技术 通过对硬件层模拟从而实现了能够在一套硬件上面运行多个操作系统因为通过硬件虚拟化使得操作系统认为在它之下就是硬件层 但是实际情况是这样的虚拟机中的OS对硬件发出的请求都交给了虚拟的硬件OS认为指令已经下达了只要等待硬件返回信息即可其实OS下面的那层“硬件”是要将指令发送给真正的硬件层来执行的 系统级别的虚拟化技术 不同于传统的硬件虚拟化它不需要模拟硬件层 多个虚拟机之间共享Host OS的Kernel内核所以这些虚拟机是不可以像传统虚拟化技术那种装各种各样的OS但是它同样可以让跑在里面的应用认为它就是处在一个独立的OS之中每个虚拟机就像一个容器里面可以装各种各样的应用而不同容器中的应用总是认为他们是在一个独立在OS环境下的所以又称为Container技术 两种虚拟化技术各有优劣对比如下图 下面是一张Container技术的结构图 从图中可以看出绿蓝红三种颜色的层组合起来就是一台Host主机在Kernel层之上通过Container技术的三个要点隔离namespace限制cgroup记录chroot 来虚拟出一个个容器并管理他们 隔离 通过namespace机制来避免一些系统级的冲突。 因为每个容器都可以当做一个独立的OS那么他们就拥有自己的pid进程号等信息如果这些东西和Host中的相冲突怎么办毕竟容器不是自己在虚拟化的环境中独立安装一个OS而是依赖于Host的OS 这时候就可以通过namespace来避免这些冲突每个容器拥有自己的namespace来管理各自的系统信息 限制 在Host看来每个Container都只是一个普通的进程当时在Container中的应用看来这些Container都是一个OS那么怎么来限制这些进程的CPU使用时间片等资源呢 cgroup是linux内核提供的限制记录和隔离进程组所用的资源 记录 上面说过每个Container都可以当做一个独立的OS既然它是一个OS那么肯定有自己的文件系统那么问题又来了每个Container都有自己的FSHost也有自己的FS这么多独立的FS要怎么管理 chroot隔离根文件系统怎么个说法呢例如Host的根目录下有ab目录并且分别被两个Container当做其根目录。在Host角度来看ab只是根目录下的两个普通文件夹而已而对于Container a来说/a就是其根目录对于Container b来说/b就是其根目录 Docker 什么是Docker Docker是一种Container技术的实现上面说到的Container技术也同样可以用来描述Docker 想一想我们在开发一个应用的时候 我们在自己的PC上完成了开发工作并将项目交给测试人员进行测试但是万一测试的PC上的环境和开发的环境不一样可能会出现各种各样的问题同理应用发布到服务器上也是一样的 应用每到一台新的PC中时就要求该PC要装上它需要的所有东西还要注意版本是不是一致的 而Docker可以帮我们解决这些问题 Docker可以创建一个个Container前面说过每个Container都可以当做一个独立的OS那么我们就可以在这个Container之中进行应用的开发。开发完成之后我们可以将这个Container打包成一个ImageImage和Container的管理可以理解成类和实例可以将其看做是一个集装箱里面装着应用和应用的各种环境 在测试的PC上通过Docker将这个集装箱Image拿过来通过其创建一个Container就可以直接进行使用和测试这个Container和开发时使用的Container的环境是一致的通过一个类实例化出来的各个对象 Docker翻译为搬运工它所做的事情也是搬运工一样的 我们可以将应用的各个组件环境等都装进一个集装箱中通过Docker运送到各个“码头上” 总结出一个Docker的最最简单的介绍方便打包发布应用到容器中 我们来看看Docker的层次图 最底层的lxcaufs都收kernel内核中运行的 lxcLinux Container是Linux上的一种实现Container虚拟化的技术早期的Docker就基于lxc实现的最新的版本中已经用libcontainer代替了 aufsAdvanced multi layer Unification FileSystem翻译成中文就是高级的分层的联合的文件系统它最总要的内容就是可以将两个目录合并在一起并可以设置操作权限read-only/read-write。Docker使用aufs来实现分层的文件管理 倒数第二层的Debian和BusyBox都是在Kernel之上的ImageImage就是一个镜像可以通过这个镜像来创建多个ContainerImage在aufs中是只读的 中间层就是通过Image创建出来的ContainerContainer在aufs中是可读可写的通过一个只读的Image创建出一个Container可以对这个Container进行修改如上图中添加了一个emacs然后在打包成一个不可读的Image而这个Image又可以创建出基于它的Container 通过上面的描述不难得出一个结论Docker中的Image是层层关联的每个Image都有一个Parent Image只有一个除外那就是Base Image即最基本的镜像其他的Image都是在Base Image基础上得到的使用一个Image时Docker会找到其Parent Image直到Base Image Docker在启动Container的时候 aufs会将下层的文件系统设置成read-only然后将Container的read-write挂载到下层的文件系统之上构成一个完整的文件系统 在Container中所做的修改不会影响到其所属的Image因为它是只读的通过COW技术将要修改的文件复制到read-write层并改写如果没有保存这个Container将其打包成一个新的Image那么当这个Container生命周期结束之后所做的修改都会消失 这种机制的好处就是每个阶段的Image都可以进行大量的重用在创建Container的时候只需要加入不同的部分即可而不用每次都将全部所需加载一遍 Docker Hub 类似于Github的服务用来分发Images里面有大量的Image提供Docker用户下载基于这些Image可以快速的搭建出我们自己所需要的Image 同时我们也可以将自做的Image push到Docker Hub中提供别人下载 Docker安装 由于是基于Kernel内核的所以Docker只能跑在Linux上而且是必须是64位的 在windows和mac系统上的Docker的宿主机并不是windows或者mac而是借助一个linux虚拟机作为其宿主机 在这里使用VM创建的一个Ubuntu来作为宿主机在Ubuntu中安装很简单 步骤如下 sudo apt-get updatesudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raringsudo rebootsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9sudo sh -c echo deb https://get.docker.io/ubuntu docker main\/etc/apt/sources.list.d/docker.listsudo apt-get updatesudo apt-get install lxc-docker 期间可能因为网络的原因会卡很久完成之后输入 docker 如果可以识别命令就是安装成功了 另外执行docker命令需要root权限所以除了使用root用户之外每条命令都要加上sudo 或者也可以通过将当前的用户加入docker用户组Docker提供的就可以随时执行docker命令 sudo gpasswd -a ${USER} dockersudo service docker restart#如果没有效果执行下列命令
newgrp - docker
#切换当前会话到新 group 因为 groups 命令获取到的是缓存的组信息刚添加的组信息未能生效所以 docker images 执行时同样有错。