文章目录
  1. 1. What
  2. 2. Why
  3. 3. Install
  4. 4. Docker和LXC区别
  5. 5. 和普通虚拟机的区别
  6. 6. Docker如何实现Container标准化
  7. 7. Container内不是不需要OS,为何需要OS的基础映象档
  8. 8. Docker Container构建方案
    1. 8.1. 过多的层级依赖关系

之前实习快结束的阶段研究了一下docker,并将当初做的一个项目借助docker举行了部署发布。今天就将之前对docker的整理发到自己blog中。

What

Docker是一个让开发者和系统管理员开发、发布、运行应用的平台。Docker可以让我们快速将组件组装成应用和在发布代码的时候避免冲突。Docker可以使我们的代码尽可能快的获得测试和部署到生成环境。

Docker包含两部分:

  • The Docker Engine
  • Docker Hub

简单的说Docker是一个构建在LXC(Linux Container)之上的,基于进程容器(Process container)的轻量级VM解决方案

Why

  • 更快的交付应用
  • 更容易部署和扩展
  • 更高密度和运行更多工作负载
  • 快速部署是我们更容易管理应用

Install

不同的平台安装指令是不同的,详见Installation.比如我是在Centos7上使用Docker,安装指令:

sudo yum install docker

使用Docker:

sudo service docker start

Docker和LXC区别

基本上你可以认为目前的Docker是LXC的一个高级封装,提供了各种辅助工具和标准接口方便你使用LXC,你可以依靠LXC和各种脚本实现与docker类似的功能。

和普通虚拟机的区别

最明显的差别是,虚拟机需要安装操作系统(安装Guest OS)才能执行应用程序,而Container内不需要安装操作系统就能执行应用程序。Container技术不是在OS外来建立虚拟环境,而是在OS内的核心系统层来打造虚拟执行环境,透过共享Host OS的作法,取代一个一个Guest OS的功用。Container也因此被称为是OS层的虚拟化技术。

普通虚拟机将整个操作系统运行在虚拟的硬件平台上, 进而提供完整的运行环境供应用程序运行, 而Docker则直接在宿主平台上加载运行应用程序. 本质上他在底层使用LXC启动一个Linux Container,通过cgroup等机制对不同的container内运行的应用程序进行隔离,权限管理和quota分配等

Docker如何实现Container标准化

Docker采用了aufs文件系统来设计一个可以层层堆栈的Container映象文件,将Container内的所有程序(包括应用程序、相关函式库、配置文件),都打包进Docker映象档,并且提供了一个Dockerfile配置文件来记录建立Container过程的每一个步骤包括参数。只要在任何支持Docker平台的环境中,就可以从这个映象档来建立出一个一模一样的Container来执行同一个应用程序。如此一来,应用程序等于是可以透过Docker映象檔,或甚至只需要Dockerfile,就能将程序执行环境带着走,移动到任何支持Docker的环境中。Docker公司也释出API,可以用来控制所有的Container相关指令,任何人只要使用同一套Docker,就等于有了同一套管理和建立Container的方法,也就等同于将Container运用标准化了。

Container内不是不需要OS,为何需要OS的基础映象档

OS基础映象档的用途是让Container拥有这OS的文件系统,例如使用ubuntu基础映象档就可以让Container建立ubuntu的根目录架构,而不是用来执行一个OS执行实例。

Docker Container构建方案

为了最大化重用Image,加快运行速度,减少内存和磁盘footprint, Docker container运行时所构造的运行环境,实际上是由具有依赖关系的多个Layer组成的。例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image,再叠加包含apache及其相关依赖library的image,这些image由AUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer用作记录对当前运行环境所作的修改。

有了层级化的Image做基础,理想中,不同的APP就可以既可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等

过多的层级依赖关系

以Layer的方式实现APP和相关library的cheap reuse和fast update是Docker的关键所在,不过受目前AUFS文件系统的限制,默认Layer的层级最多只能达到127(曾经只有42),在实际使用中有多种情况可能导致你的container的层级关系快速增长到这个极限值,撇开这么多layer叠加以后AUFS的效率不谈,更多情况下是你无法再更新构建你的image了

  • 使用Dockerfile构建Image时,每条指令都会给最终的Image增加一层layer依赖关系.
  • 以修改,提交,再修改再提交的方式不停的调整,更新你的Image
  • 从仓库中下载的别人的Image已经包含众多的层级依赖关系,而你需要进一步更新以创建你自己的版本

前两者在一定程度上还是你自己可能把控的,最后一种情况就没办法了。这个问题最终必将影响Docker的实际可用性,目前的解决方案包括:

  • 使用Dockerfile时,尽可能合并多个操作:例如使用 “&&” 或 “;” 合并运行多个shell命令;将多个shell命令写成脚本,在dockerfile中添加并运行这个脚本
  • 通过Export再Import Image,丢弃所有历史信息和依赖关系,创建一个全新的image
文章目录
  1. 1. What
  2. 2. Why
  3. 3. Install
  4. 4. Docker和LXC区别
  5. 5. 和普通虚拟机的区别
  6. 6. Docker如何实现Container标准化
  7. 7. Container内不是不需要OS,为何需要OS的基础映象档
  8. 8. Docker Container构建方案
    1. 8.1. 过多的层级依赖关系