在看过Docker的两个Hello World的程序后,我们对Docker有了一个大概的感性的认识,那么Docker是到底是什么呢?Docker是一个面向开发者和系统管理员编译,装载,和运行分布式应用的开放式平台。它包括了Docker引擎,一个可移植的,轻量级的,运行时环境和打包工具,还包括了Docker Hub,一个用于共享应用和自动化工作流的云服务。

Docker和一般的虚拟机有什么不同之处

  对一般的虚拟机而言,每个虚拟化的应用包括的不仅仅是这个应用本身(大概数十M)以及应用所必需的bin文件和lib文件,此外还必须有一个虚拟化的操作系统(少则几G,多则十数G)。如下图所示。

图1.一般虚拟机系统的结构(官网截图)

  而对于Docker而言,Docker引擎容器仅仅包含了应用本身和它的必须的依赖(文件或者镜像等),它在宿主操作系统中的用户空间(userspace)中以隔离的进程(容器)分别的运行着,只是和其他容器共享了Docker内核。这样,它就能在享有资源的隔离和分配的优势的同时,还保持高可移植性和高效性的优势。

图2.Docker的结构(官网截图)

文件系统

  为了进一步透彻地了解Docker的优势所在,我们需要熟悉Docker的层次结构,这里详细了解一下Docker的文件系统。熟悉Linux系统的朋友应该知道,让一个Linux系统运行起来,我们需要两个文件系统:

  1.boot文件系统(bootfs)

  2.root文件系统(rootfs)

  bootfs包括了boot加载器(bootloader)和内核(kernel),用户永远不对bootfs做任何修改,实际上,在boot加载完成以后,整个内核都在内存中了,bootfs会被卸载掉以释放和初始RAM磁盘相关联的内存。

  rootfs包括我们熟悉的类Unix系统的标准结构:包括/dev, /proc, /bin, /etc, /lib, /usr, /tmp,以及所有用户需要运行各种应用的配置文件,二进制文件和库文件(像bash, ls等)

图3.Linux的bootfs和rootfs(官网用图)

  在不同的Linux发行版中,内核也可能有很大的不同,通常rootfs内核的内容和组织都是我们的软件包依赖当前而不是另一个发行版的主要原因(这里就产生了应用对于不同发行版的Linux的依赖性)。而Docker可以通过同时运行多个发行版来帮助我们解决这个问题。

图4.Docker文件系统(官网用图)

  这里我们应该理解了Docker的优势所在了,有了Docker,开发者们可以用任何工具链和任何语言构建任何应用。Docker化的应用完全可移植,可以在任何地方运行。

  不仅如此,开发者可以通过Docker Hub上的超过1.3W个应用来快速上手,而且这些应用由Docker来管理和维护更新以及相互之间的依赖关系,让管理员更便于了解开发者编写的应用是怎样工作的。开发者们可以通过Docker自动化他们的开发流程并且能通过公有的或者私有的云库进行团队合作。

  Docker能使开发者更快的构建和装载高质量的应用。

  对于系统管理员,使用Docker可以为开发提供标准化的环境,质量保证和生产团队。不再是“在我的机器上工作”,通过Docker化应用及其依赖,系统管理员可以忽视操作系统底层的差异。此外,Docker引擎上的部署是以单元来实现的,而通过将这种方式标准化,系统管理员们能在工作负荷量上面获得更多的弹性。无论是私有服务器或者数据中心虚拟机还是公有云,部署的工作量被基础结构技术的束缚程度都更低,而更多地是被商业政策优先引导。除此之外,Docker引擎的轻量级运行时环境实现了在响应指令变化时所需要的快速扩大(scale-up)放缩(scale-down)功能。

  Docker能使系统管理员在任何环境设施下部署和运行任何应用,更快,更可靠。

Docker,用任何工具链和任何语言来构建任何应用的更多相关文章

  1. Go语言中的打包和工具链

    包 所有Go语言的程序都会组织成若干组文件,每组文件被称为一个包.这样每个包的代码都可以作为很小的复用单元,被其他项目引用. 包名惯例 给包命名的惯例是使用包所在目录的名字.并不需要所有包的名字都与别 ...

  2. 从大厂DevOps工具链部署,看现代产品的生命周期管理

    目录 1. 认识DevOps 1.1. DevOps工具链 1.2. CI 持续集成(Continuous Integration) 1.3. CD(持续交付 & 持续部署) 1.4. Agi ...

  3. X86上搭建交叉工具链,来给龙芯笔记本编译本地工具链(未完待续)

    故事的背景是,我买了一台龙芯2F的笔记本来装B. 为什么说是装B呢?因为不但操作系统是Linux,而且CPU还是龙芯的. 一般人有这么酷的装备吗?简直是装B大圣啊. 这里一定要申明一点,本人不是IT技 ...

  4. gcc工具链简述

    工具链软件包括BINUTILS.GCC.GLIBC.GDB等. BINUTILS是二进制程序处理工具,包括链接器.汇编器等目标程序处理的工具. GCC(GNU Compiler Collection) ...

  5. GNU工具链学习笔记

    GNU工具链学习笔记 1..so为动态链接库,.a为静态连接库.他们在Linux下按照ELF格式存储.ELF有四种文件类型.可重定位文件(Relocatable file,*.o,*.a),包含代码和 ...

  6. cmake工具链

    命令project() enable_language()try_compile() 变量CMAKE_<LANG>_COMPILERCMAKE_<LANG>_COMPILER_ ...

  7. DevOps时代,企业数字化转型需要强大的工具链

    伴随时代的飞速进步,中国的人口红利带来了互联网业务的快速发展,巨大的流量也带动了技术的不断革新,研发的模式也在不断变化.传统企业纷纷效仿互联网的做法,结合DevOps进行数字化的转型. 通常提到Dev ...

  8. X86给龙芯笔记本编译本地工具链(未完待续)

    我买了一台龙芯2F的笔记本来当玩具. 买回来发现,这台笔记本上没法安装软件,因为既没有软件仓库,也没有GCC. 因此需要构建交叉工具链和构建本地工具链. 下面是我研究如何搞定着一切的笔记. 工具链组件 ...

  9. 【嵌入式】使用Cross Toolchain构建交叉工具链

    Preface 前面编译linux内核的时候,用各种cross版本都不行啊,真是纠结,于是就想着自己也要会编译交叉工具的方法,然后各种尝试,各种问题啊,最后还是没解决(还有其它事情),步骤我都走熟了, ...

随机推荐

  1. Activity的跳转及返回值 的四种方法

    Activity生命周期 从创建到销毁的生命周期: onCreate()→onStart()→onResume()→onPouse()→onStop()→onDestroy() 从起动到后台再到前台: ...

  2. springboot中使用filter用配置类方式

    在03-springboot-web的Filter包下,创建HeFilter类 代码示例: package com.bjpowernode.springboot.filter; import java ...

  3. python+Appium自动化:Appium元素检测

    appium模拟用户的真实操作,如果用户第一次进入app或许会弹出一些更新提示,或者是引导页面,但是下一次开启app时则没有引导页这些界面,这时,脚本中又肯定不考虑用两套代码来进行维护,此时如何应对这 ...

  4. 几台WEB经常宕机,求分析原因

    几台WEB服务器经常宕机,平时运行得好好的,负载也都在2以下,偶尔会突然负高上去就宕机,init 6也无法重启成功 只能echo 'b'>/proc/sysrq-trigger 硬重启才行,dm ...

  5. Codeforces 871C 872E Points, Lines and Ready-made Titles

    题 OvO http://codeforces.com/contest/871/problem/C ( Codeforces Round #440 (Div. 1, based on Technocu ...

  6. C# List分组

    //分组 8个为一组 List<List<string>> ArrayList = sArray.Select((x, i) => new { Index = i, Va ...

  7. vue cli3 + cube-ui 配置rem踩坑记录

    在install cube-ui时,选择了后编译,选中使用rem的时候会发现,怎么刷新页面的html字体被设置成了37.5px 感觉太大了,于是去寻找修改的办法,第一反应是webpack的配置,于是去 ...

  8. Program Transformation Semantics (程序转换语义学)

    本文是Inside The C++ Object Model Chapter 2 部分的读书笔记.讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学&qu ...

  9. 从gcc到Makefile简易版

    1.Makefile的应用 我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件.2.Makefle简单例子的深入学习 程序概述:为了连接makefile的流程,我将 ...

  10. 判断一个ip地址合法性(基础c,不用库函数)

    #include <stdio.h> int judge(char *strIp); int main() { ]; ) { scanf("%s", a); == ju ...