docker的原理和应用场景

什么是Docker?

docker : https://baike.baidu.com/item/Docker/13344470?fr=aladdin
 
Docker: 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中去,然后发布到任何的流行的Linux机器上,也可以实现虚拟化,容器之间使用的沙箱机制,相互之间不会有任何的接口。
 
一个完整的Docker由以下的及各部分组成:
    1.dockerClient客户端
    2.docker Daemon守护进程
    3.Docker Image镜像
    4.Docker Cpntainer容器
起源:
    Docker自2013年以来非常火热,无论是从github上的代码活跃度,还是redhat6.5中集成对Docker的支持,就连Google的Compute Engine 也是支持docker在其之上运行
 
Docker 架构:
    Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器,Docker容器通过Docker镜像来创建。
 
    Docker daemon一般在宿主机上运行,等待接收来自客户端的消息.Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker Daemon 交互.
 
Docker 的优缺点:
  优点:由于基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小,因此对于构建隔离的标准化运行环境有一定的优势,
  更为重要的是Docker旨在弹性计算,每个Docker实例的运行周期是有限的,实例数量更具需求增减(就好比进程,需要就存在,不需要就消失)
 
    
  局限:Docker并不是全能的
    1.Docker是基于Linux64bit,无法在32bit的linux环境下使用,
    2.LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base,
    3.个理性相比KVM之类的虚拟化方案还是有欠缺的,所有container公用一部分的运行库
    4.网络管理相对简单,主要是基于namespace隔离,
    5.cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比比较有限
    6.Docker对disk的管理比较有限
    7.container随着用户进程的停止而销毁,container中的log等用户数据不便收集
    
Docker并非适用于所有的场景,Docker只能虚拟于Linux的服务, Windows Azure服务能够运行Docker实例,但到目前为止Windows服务还不能够被虚拟化。
 
Docker最大的障碍在于管理实例间的交互。Docker在本质上是一个附加系统,使用文件构建一个应用是有可能的,组件可以被添加到之前的组件之上。
分层架构带来另一方面的效率提升,当你重建正在变化的Docker镜像时,只要重建变化的部分,不需要整体的改变。
 
针对Docker的不足,意味着在开始部署Docker前需要考虑以下几个问题,首先Docker是无状态的,因此Docker不应该承担数据的交易,所有的数据都应该保存在数据库中。
 
其次对Docker而言,开发Docker的实例并不像创建一个虚拟机那么简单,管理员应该对系统的管理的各个方面有相应的全面的了解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt
 
小注解:Puppet实现的是对系统主机资源的管理,使得当前的系统在puppet的运行下按照最新的配置的设备进行运行。是一个开发的对系统管理的工具。
 
总结:在上述的Docker的认识中,我们知道Docker是一个基于LXC的应用容器引擎,它可以把你需要的软件及相应的依赖包和所需的环境封装到一个容器中,容器可以进行转移,也可以存在与云。
相对于虚拟机的封装来说,容器轻量级,秒级,易于创建和管理,但是也有一定的局限性。
容器由三个组成部分构成:DockerClient,DockerDaemon,DockerImage, 客户发起请求-->daemon会接受客户的请求并处理,image是用来创建容器的(就好像把一些常用的功能封装到一个镜像中,那个容器需要什么功能就可以对镜像进行再次封装并且创建容器)

下来我们从网上来找找到底什么是docker?
    相对于较难理解的来说,下面的这篇文章,会有更好的理解
    以下的内容来源于:https://zhuanlan.zhihu.com/p/53260098

docker的背景:
    2010有几个搞IT的人在美国旧金山成立了一家叫做"dotCloud"的公司,
这个公司主要是用来提供基于PAAS的云计算服务,也就是与LXC(linux container )有关的容器技术。
后来,dotCloud公司将自己的容器进行了简化和标准化,并命名为---Docker
但是最开始并没有多少人关注这个项目,在快要坚持不住的时候将她们的项目进行了“开源”。
2013年,dotCloud的公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定Docker项目开源。
那么在Docker火了之后,Docker公司干脆把公司的名字改名叫Docker Inc.

在容器之前,业界的网红是虚拟机。虚拟机技术的代表是VMWare和Openstack.
虚拟机属于虚拟化技术。而Docker这样的容器,也是虚拟化技术,属于轻量级的虚拟化。

虚拟机和容器的区别:
    虚拟机虽然可以隔离很多的“子电脑”,但是占用的空间更大,启动更慢,虚拟机软件可能还要花钱。
    而容器恰好没有这些缺点。它不需要虚拟出整个操作系统,只要虚拟出一个小规模的环境(类似于沙箱)。
    特性            虚拟机                 容器
隔离级别            操作系统级别            进程级别
隔离策略            Hypervis              CGroups
系统资源            5~15%                 0~5%
启动时间            分钟级                 秒级
镜像存储            GB-TB                 KB-MB
集群规模            上百                   上万
高可用策略          备份、容灾、迁移        弹性、负载、动态

大家要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
也就是说:类似于KVM可以进行虚拟机的创建,删除,管理是一样的;docker是一个创建,删除,管理容器的工具。

容器使用的核心是隔离策略是cgroups,那么什么是Cgroups?
    Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制;
最初由goole的工程师提出,后来被整合进Linux内核,Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
    作用:Cgroups最初的目标是为资源管理提供一个统一的框架,现在cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统的虚拟化cgroup提供了以下的功能:
    1.限制进程组可以使用的资源数量(Resource limiting )。
    2.进程组的优先级控制。
    3.记录进程组使用的资源数量。
    4.进程组隔离。
    5.进程组控制。

接下来看看docker的主要的创建:
    想要搞懂docker,其实看两句口号就行了,“Build, Ship and Run".
也就是,”搭建、发送、运行“,比如来到一个空地想要搭建一个房子,于是可以划图纸、一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一个地方去,那么就肯定要重新画图,搬石头,砍木头,重新盖。
但是,跑来一个巫婆,教会了一种魔法,这种魔法可以把盖好的房子复制一份,做成”镜像“,放在我的背包里。
等到了另一个空地,就用这个”镜像“,复制另一个房子,摆在那边,直接可以住。
所以,Docker的第二句口号是:”Build once,Run anywhere(搭建一次,到处能用)“。

Docker技术的三大核心概念,分别是:
  镜像(Image)
  容器(Container)
  仓库(Repository)

镜像:就是一个只读的模板,例如:一个镜像可以包含 一个完整的操作系统环境,里面仅安装了Apache或者用户需要的其他程序应用。
镜像可以用来创建Docker容器,一个镜像可以很多容器,Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,
用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像(Image)就是一堆只读层的统一视角,
统一文件系统技术能够将不同的层整合到一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

仓库(repository):仓库是存放镜像文件的场所。那么要注意仓库和注册仓库并不一样,
实际上,仓库注册服务器上存放着很多个仓库,每个仓库又含有多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载,国内的公开仓库包括 时速云 、网易云,可以提供大陆使用更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
那么当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只要需要从仓库上pull就可以了。

容器(container):Docker利用容器来进行运行应用,容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除、每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义几乎和镜像是一模一样,也是一堆的统一视角,唯一的区别在于容器的最上面的一层是可读写的。
一个运行态容器定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。

Docker的组成部分?

Docker的基本组成:
Docker Client 客户端
Docker Daemon 守护进程
Docker Image  镜像
Docker Container 容器
Docker Registry 仓库
 
Docker客户端的守护进程/守护进程:
    Docker是C/S架构的程序,Docker客户端向Docker服务器也就是Docker的守护进程发出请求,守护进程处理完所有的工作返回结果。
    Docker客户端对服务端的访问既可以是本地的,也可以是远程的。

Docker Image镜像:
    Docker镜像是一个层级的只读文件系统,最底层是一个引导文件系统即bootfs,这是很典型的linux的引导文件系统,Docker用户几乎不会和引导文件有交互。
    实际上,当一个容器启动后,它将会被移到内存中,而引导文件则会被卸载。Docker系统的第二层是rootfs文件,rootfs文件系统可以是一个或者多个操作系统,比如Centos、Ubuntu,在传统的Linux引导过程中rootfs文件系统会先以只读的方式加载,当引导结束以后完成引导检查,它才会被切换成读写模式。
    但是在Docker里,rootfs文件系统永远只能是只读的状态。
    Docker运用联合加载的技术,又在rootfs文件系统之上加载更多的只读文件系统,联合加载是指一次同是加载多个文件系统,但是在外面看起来,只能看到一个文件系统。
联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有的底层文件和目录,Docker将这样的文件系统称为镜像。
一个镜像可以放到另一个镜像的顶部,对于下面的镜像成为父镜像,可以依次类推知道镜像栈的最底部,最底部的镜像称为基础镜像。

Docker Container 容器
    容器通过镜像来启动,Docker的容器是Docker的执行来源,容器中可以运行客户的一个或者多个进程,
如果说镜像是Docker生命周期的构建和打包阶段,那么容器则是启动和执行阶段。
    启动和执行阶段:当一个容器启动时Docker会在该镜像的最顶层,加载一个读写文件系统也就是一个可写层文件层,
我们在Docker中运行程序,就是在可写层执行的。
    写时复制(copy on write):当Docker第一次启动一个容器时,初始的读写层是空的,
当文件系统发生变化时,这些变化都应用到这一层,比如想修改一个文件,文件首先会从读写层下面的只读层,复制到读写层,
文件的只读版本依然存在,但是已经被该文件读写层的文件副本所隐藏,这就是Docker中一个重要的技术写时复制,
每个镜像层都是只读的,并且以后永远不会发生变化,
当创建一个容器时,首先会构建镜像栈,在栈的最顶层添加可写层,这个读写层加上下面的镜像层以及一些配置数据,就构成了一个容器,
这个容器的这种特点,加上镜像分层的框架,是我们可以快速的构建镜像,并运行包含我们自己应用程序的容器。

Docker registry 仓库
    Docker用仓库来保存用户构建的镜像,仓库分为私有和公有两种。
公有:Docker公司自己提供了一个公有的仓库叫做Docker Hub,我们可以在Docker Hub上面注册账号保存自己的镜像,也可以通过Docker hub 来pull我们需要的镜像,为我们构建镜像节约时间。
私有:我们可以自己搭建自己的私有仓库。

Docker实现的原理?

在进行原理的了解之前,我们先了解以下的一些基本的简介。
原文来自:https://blog.csdn.net/bbwangj/article/details/82668505

Nampspaces
命名空间是Linux为我们提供的用于分离进程树,网络接口、挂载点以及进程间通信等资源的方法。
在日常使用Linux或者macOS时,并没有运行多个完全分离的服务器的需要,但是如果在服务器上启动多个服务,这些其实相互会影响的,
每一个服务都会看见其他服务的进程,也可以访问宿主机上的任意文件,
那么我们其他的文件或者资源肯定会受到一定的影响,这是我们不愿意的。
再者在服务间相互影响的情况下,一旦服务器上的某个服务被入侵,那么入侵者就能够访问当前的机器上的所有服务文件,
而Docker其实通过LInux底下的Namespaces对不同容器实现了隔离。

Linux的命名空间提供了以下七种不同的命名空间,包括CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CONE_NEWPID、CLONE_NEWUSER和CLONE_NEWUTS,通过这七个选项我们能够在创建新进程时,设置新进程应该在哪些资源上与宿主机进行隔离。

进程
进程是一个正在执行的程序,也是分时系统中的一个任务单元,在Linux及其相关的系统上,我们都可以通过ps命令打印出当前os正在执行的进程。

例如:在linux下运行一个新的容器Docker,通过exec进入bash并打印其中的全部进程,那么在执行了ps之后会出现非常干净的进程列表。

网络
Docker容器通过namespaces完成了与宿主机的进程隔离(包括网络隔离),但是却没有办法通过宿主机的网络连接互联网,会有很多的限制。
所以Docket虽然隔离了网络,但是Docker中的服务仍需要和外界相连才能发挥作用。
每一个使用Docker run启动的容器其实都有单独的网络空间命名,Docker为我们提供了四种的网络模式Host、Container、None、Bridge模式。

挂载点
如果一个容器需要启动,那么它一定需要提供一个rootfs,容器需要使用这个文件系统来创建一个新的进程,所有的二进制执行都必须在这个根文件系统中。
想要正常的启动一个容器选哟在rootfs中挂载以上特定的目录,除上述的几个目录需要挂载之外我们还需要建立一些符号连接保证系统IO不会出现问题。
为了保证容器的进程没有办法访问宿主机上的其他目录,我们还需要通过libcontainer提供的pivot_root或者chroot函数改变进程能够访问的文件目录的根节点。

chroot
通过改变当前系统的根目录,限制用户的权限,在心的根目录下并不能访问旧系统目录的结构文件,也就是建立了一个与原系统完全隔离的目录结构。

进程隔离cgroups、LXC、联合文件系统(UnionFS)三大技术支撑了Docker的实现。属于Docker的核心技术。

cgroups
cgroup是限制某个或者某些进程的资源分配,cgroups == controller group,
在这个group中有分配好的特定比例的cpu时间,IO时间,可用内存大小等等。
Cgroup是将任意进程分组化管理的Linux内核功能。
cgroup中的重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配
首先挂载子系统,然后才有cgroups的,
比如挂载memory子系统,在memory子系统中创建一个cgroup的节点,在这个节点中,将需要控制的进程id写入,并将控制的属性写入,这就完成了内存的资源限制。
cgroups被linux内核支持,有很大的优势,在很多的领域可以取代虚拟化技术分割资源,
cgroup默认有很多的诸多资源组,可以限制几乎所有的服务器上的资源:cpu mem iops net device acess 等

LXC
lxc是Linux Containers的简称,是一种基于容器的操作系统层的虚拟化技术,借助于namespaces的隔离机制和cgroups的限额功能,
LXC提供了一套API工具来管理container。LXC与其他的操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合到内核中去。不用单独为内核打补丁。
LXC旨在提供一个共享的kernel的OS级虚拟化方法,在执行时不用重复的加载KERNEL,且容器的kernel与host是共享,
因此加快了容器的启动速度,并且减少了内存的消耗,容器在隔离机制下的同时,还通过与主机共享资源来节省开销,
这就意味着容器比真正的虚拟机开销要小的多,
虽然容器使用的这种类型的隔离总的来说非常强大,与虚拟机相比各有优缺点,如果内核停止,那么容器就会停止。
性能方面:LXC >> KVM >>XEN
内存利用率:LXC >> KVM >> XEN
隔离程度: XEN >> KVM >> LXC

那么KVM肯定都知道,什么是XEN呢?
百度:XEN是一个基于X86架构、发展快、性能稳定、占用资源少的开源虚拟化技术。

AUFS:联合文件系统
是一个能透明覆盖一个或者多个现有文件系统的层状文件系统,支持将不同目录挂载到同一个虚拟文件系统下,
可以把不同的目录联合起来,组成一个单一的目录,这是一种虚拟的文件系统,文件系统不用格式化,直接挂载就好了。
Docker一直在用AUFS作为容器的文件系统。当一个进程需要修改一个文件时,AUFS创建该文件的副本。
AUFS可以把多层合并成文件系统的单层表示,这个过程叫做写时复制。
使用AuFs的另一个好处是Docker的版本容器镜像能力,每个新版本都是一个与之前的版本的差异,有效的保持镜像的最小化,但是总要有一个记录从该容器的一个版本到另一个版本的审计跟踪。

Docker的基本应用场景?

具体的应用的场景,可以参考以下的网站中的实例。

dockone.io/article/126

Docker的优缺点?

总结:

https://blog.csdn.net/xzwspy/article/details/81154945

https://blog.csdn.net/jingzhunbiancheng/article/details/80994909

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值