Docker技术原理介绍

前言

玩docker有阵子,随着使用的频繁,学习的深入,愈发有了不不少的困惑,于是又回过头复习这些理论知识。还是那句话,温故而知新,每一次阅读都会有不一样的收获。

简介

Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将App变成一种 标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行
简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件 可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开 发环境分开,互不影响,这是 docker 最普遍的一个玩法。

Docker相关的核心技术

cgroups

Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。于是就出现了cgroups的概念, cgroup就是controller group ,在这个group中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等。 cgroups是将任意进程进行分组化管理的Linux内核功能。最初由google的工程师提出,后来被整合进Linux内 核中。
cgroups中的 重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系 统是控制cpu时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在 memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入, 这就完成了内存的资源限制。
cgroups 被Linux内核支持,有得天独厚的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。 cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源:cpu mem iops,iobandwide,net,device acess等

LXC

LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制 和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚 拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁

LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host 共享,因此可以大大加快container的 启动过程,并显著减少内存消耗,容器在提供隔离的同时,还通过共享这 些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。 在实际测试中,基于LXC的虚拟化方法的IO和 CPU性能几乎接近 baremetal 的性能。

虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor上的虚拟机那么强壮仍具有 争议性。如果内核停止,那么所有的容器就会停止运行。

• 性能方面:LXC>>KVM>>XEN

• 内存利用率:LXC>>KVM>>XEN

• 隔离程度: XEN>>KVM>>LXC

AUFS

什么是AUFS? AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一 个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文 件系统不用格式化,直接挂载即可。
Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。 AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制( copy on write )。

AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS 系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容 器部署。
使用AuFS的另一个好处是Docker的版本容器镜像能力。每个新版本都是一个与之前版本的简单差异改动, 有效地保持镜像文件最小化。但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本改动的 审计跟踪。

Docker原理之App打包

LXC的基础上, Docker额外提供的Feature包括:标准统一的 打包部署运行方案
为了最大化重用Image,加快运行速度,减少内存和磁盘 footprint, Docker container运行时所构造的运行环境,实际 上是由具有依赖关系的多个Layer组成的。例如一个apache 的运行环境可能是在基础的rootfs image的基础上,叠加了 包含例如Emacs等各种工具的image,再叠加包含apache及 其相关依赖library的image,这些image由AUFS文件系统加载 合并到统一路径中,以只读的方式存在,最后再叠加加载 一层可写的空白的Layer用作记录对当前运行环境所作的修 改。
有了层级化的Image做基础,理想中,不同的APP就可以既 可能的共用底层文件系统,相关依赖工具等,同一个APP的 不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等

Docker基本概念

Docker Image

• Docker Image是一个极度精简版的Linux程序运行环境,比如vi这种基本 的工具没有,官网的Java镜像包括的东西更少,除非是镜像叠加方式的, 如Centos+Java7

• Docker Image是需要定制化Build的一个“安装包”,包括基础镜像+应 用的二进制部署包

• Docker Image内不建议有运行期需要修改的配置文件

• Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。 当前目录下包含Dockerfile,使用命令build来创建新的image

• Docker Image的最佳实践之一是尽量重用和使用网上公开的基础镜像

Docker Container

• Docker Container是Image的实例,共享内核

• Docker Container里可以运行不同Os的Image,比如Ubuntu的或者 Centos

• Docker Container不建议内部开启一个SSHD服务,1.3版本后新增了 docker exec命令进入容器排查问题。

• Docker Container没有IP地址,通常不会有服务端口暴露,是一个封闭的 “盒子/沙箱

Docker Container的生命周期

Docker Daemon

• Docker Daemon是创建和运行Container的Linux守护进程,也是Docker 最主要的核心组件

• Docker Daemon 可以理解为Docker Container的Container

• Docker Daemon可以绑定本地端口并提供Rest API服务,用来远程访问 和控制

Docker Registry/Hub

Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry(Docker Hub)的生态圈也是相当吸引人眼球的地方。在Docker Hub上你可以很轻松下载 到大量已经容器化好的应用镜像,即拉即用。这些镜像中,有些是Docker官方维 护的,更多的是众多开发者自发上传分享的。而且 你还可以在Docker Hub中绑定 你的代码托管系统(目前支持Github和Bitbucket)配置自动生成镜像功能,这样 Docker Hub会在你代码更新时自动生成对应的Docker镜像。

问题点: Docker Hub是dotCloud公司私有的 国内曾有公司试图提供镜像服务,但被禁止 目前国内只有一个DaoCloud提供代理缓存服务

docker原理及基本概念相关推荐

  1. 一篇不一样的docker原理解析

    0 引言 在学习docker的过程中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率降低不少.而在讲解docker原理上,所有的讲解都是关于 ...

  2. 面试官留步!听我跟你侃会儿Docker原理

    1 Docker 简介 1.1 Docker 由来 Docker 是基于 Go 语言开发的一个容器引擎,Docker是应用程序与系统之间的隔离层.通常应用程序对安装的系统环境会有各种严格要求,当服务器 ...

  3. 面试官:说一说 Docker 原理

    开发人员开发完一个电商项目,该 Jar 项目包含 Redis.MySQL.ES.Haddop等若干组件.开发人员自测无误后提交给测试进行预生产测试了. 测试:你的这个服务,我在进行单元测试跟数据核对的 ...

  4. docker原理介绍以及部署使用

    docker原理介绍以及部署使用 1. docker简介 2. docker架构概念 3. docker安装部署 3.1 安装环境 3.2 安装步骤 4. docker使用 4.1 镜像管理 4.2 ...

  5. 深入浅出Docker原理及实战(三)——制作Dockerfile

    声明:这是我在大学毕业后进入第一家互联网公司学习的内容 深入浅出Docker原理及实战系列第三篇,我主要分享如何制作一个Dockerfile,以及基本命令格式. Dockerfile简介 Docker ...

  6. Docker原理(图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...

  7. Docker原理与基础操作

    目录 Docker原理 使用场景: Docker核心概念与安装方式 Docker与虚拟机区别 yum仓库安装docker 安装依赖包 设置阿里云镜像源 安装Docker-ce 启动docker 镜像加 ...

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. 一篇不一样的docker原理解析 提高篇

    在上一篇 一篇不一样的docker原理解析 - uncle creepy的文章 - 知乎专栏 中,主要讨论了容器和虚拟机的区别,在实现细节上并没有深入,只是点到即止,在这篇提高篇中,将详细讨论容器的实 ...

最新文章

  1. 贵州高二会考计算机考试题,20167月贵州普通高中学业水平考试会考试题
  2. Object-C与Swift混合开发
  3. Search Insert Position @leetcode
  4. 私家车合乘系统 matlab,私家车贴上邻里合乘标志 武汉探路拼车合法化
  5. css 图片换行_前端学习口诀VI:html+css口诀结尾篇,值得收藏!
  6. robotframework 配置过程中遇到的问题
  7. 链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序
  8. 懂得智能配色的ImageView,还能给自己设置多彩的阴影(PaletteImageView)
  9. 《Linux内核分析》(二)——从一个简单Linux内核分析进程切换原理
  10. php 查字符串,PHP查询字符串技巧分享
  11. Java中按值传递与按引用传递的区别
  12. 27. 使用distance和advance将容器的const_iterator转换成iterator
  13. JavaSE——Java8之Stream流
  14. vue init download template_Webpack(四)Vue
  15. AI智能电话机器人源码搭建揭秘!语音机器人电销机器人源码系统那些事
  16. en60204标准_《EN_60204_机械产品电气安全标准介绍》.pdf
  17. unity材质球复制
  18. 影像信息提取之——DEM提取
  19. GlobalMapper导出S57水深数据
  20. 螺纹铣刀与丝锥攻丝有什么区别,谁的优势大呢

热门文章

  1. 诸葛亮司马懿大战房市
  2. 浅谈程序员的行业选择---程序人生
  3. 杰理之脑连接样机蓝牙 , 开启音量同步 , 电脑无法大范围 量 调节音量【篇】
  4. 雪球结构定价与风险深度分析
  5. mysql 全局锁_Mysql全局锁和表级锁
  6. 【kafka】kafka创建topic如何确定分区,如何计算kafka机器台数
  7. 消费者心声:我手机的镜头已经够好了,什么时候给我防防水?
  8. php简体转繁体类库源代码
  9. Android App包瘦身优化
  10. C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_6.2.4关联式数组