为什么是Docker

进入21世纪,继互联网之后,云计算开始大放异彩。云计算是互联网发展后期的必然方向,反过来,云计算也进一步推动了互联网的发展。云计算模式最关键的突破就是资源使用方式的改变。

云计算是一种融合了多项计算机技术的、以数据和处理能力为中心的密集型计算模式,它的主要技术包括虚拟化、分布式资源管理、分布式并发编程模式、信息安全等。其中,虚拟化作为云计算的核心元素,其价值日益体现:一方面,集中部署 IT 资源并抽象化以实现多用户共享,极大程度地提高了资源的利用率,降低了使用成本;另一方面,缓解了复杂的软硬件适配问题。所以, 虚拟化技术是云计算中最关键、最核心的技术原动力。

在早期,主流的虚拟化技术是虚拟机,它实现了极高的隔离度和标准化, 但是这种基于硬件隔离的虚拟化方案也给宿主机资源带来了极大的压力。

为了解决虚拟机的种种问题,获得比虚拟机更快、更少资源的虚拟化方法, 就需要对资源进行比虚拟机更高级别的抽象。通过更细的粒度对资源进行分配和控制,是一种可行的思路。为此,Linux内核添加了新的技术,这便是众所周知的控制组(cgroup) 。通过这一技术来对服务进行运行时隔离,这种被隔离起来的运行时环境,被称为Linux容器(LXC)。

Docker是基于LXC容器技术的封装,Go语言开发实现。Docker与虚拟机的详细对比,可参见阮一峰老师的《Docker入门教程》,这里不再赘述。

在Docker生态环境的不断完善下,Docker技术的最佳实践场景也越来越多,除了基础云服务平台,在CaaS、CI、CD、DevOps、微服务架构等方面也吸引了越来越多的目光。

Docker是什么

Docker作为一种轻量级虚拟化技术,其本质是一个进程以及运行该进程所需要的依赖,而Docker内的所有进程是这个容器进程的子进程。在这种虚拟化模型下,通过资源隔离、资源控制等技术手段,来解决Docker在实现虚拟化目标过程中遇到的种种障碍。

Docker容器间的资源隔离,通过Linux内核的 namespace实现。这里的资源包括:网络空间(net)、文件系统空间(mnt)、用户空间(user)、进程空间(pid)、进程通信空间(ipc)和域名空间(uts)。这些空间的隔离需求都是虚拟化的基本需求,都很好理解,这里只简单讲一下域名空间。通过域名空间的隔离,每个Docker就可以拥有独立的主机名和域名,在网络上可以被视作一个独立的节点,而不再是宿主机上的一个进程。

对 Docker 而言, 一方面要实现各容器的良好隔离, 另一方面还需要对容器使用的资源进行限制和管理。

Docker 依靠 Linux 提供的 cgroup 技术来实现资源控制。cgroup 是由 Linux内核提供的一种对各进程组所使用的物理资源( 包括CPU、Memory、IO等) 进行记录、限制和隔离的技术。cgroup的实现本质上是给任务挂上钩子,当任务运行的过程中使用某种资源时,就会触发钩子上锁附带的子系统进行检测,根据资源类别的不同,使用对应的技术进行资源限制和优先级分配。

换个角度看,Docker也是一个执行环境,一个与宿主机共享内核但与系统中其他进程资源相隔离的执行环境,这就是Docker容器。

从上图官网给出Docker架构图可以看出,这个执行环境需要提供这几个基本要素:

  • Docker client:Docker客户端;
  • Docker deamon:Docker服务端,处理用户(Docker client)请求;
  • Docker Registry:Docker镜像仓库。

Docker 中有两个重要概念, 一个是镜像( Image) , 另一个是容器( Container)。可以这么理解,镜像是容器的静态表现形式或物理存储对象,而容器是镜像的动态表现形态或内存存储对象。

之所以抽象出镜像这个概念,是为了解决LXC容器的可移植性问题,即无法通过标准化的镜像/模板实现虚拟容器的制、复制、重建。 因而 Docker 在 LXC 基础上进行了进一步封装,通过文件系统存储技术(如aufs、device mapper、overlayfs)实现镜像的分层、写时复制、联合挂载、内容寻找等关键技术特性,很好地解决了容器的快速移动和更新问题。

这里特别提一下为什么把分层作为镜像的重要特性。镜像中大部分文件都是相同的(如rootfs等),如果不分层,势必存在众多的文件冗余,造成镜像大小沉重。通过分层技术,实现在不同镜像之间共享镜像层,实现轻量级别的镜像配置,提高Docker镜像构建、存储和分发的效率,节省了用户的时间和存储空间。

回到最开始的问题:Docker是什么?这取决于看它的视角。从操作系统的视角来看,它是进程;从用户的角度来看,它是运行环境;从开发的角度来看,它是虚拟化技术。

Docker云是什么

Docker作为云计算虚拟化的一环,打开了云计算的大门。进入云计算的大门后,发现门后的新的生态系统是如此庞大。在分布式的生产使用中,容器相关的网络、存储、集群、高可用性等都是不得不面对的问题。从容器到容器云的进化应运而生。

容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。

Docker只是个单机下的容器管理工具,通过命令行进行手动管理。在企业使用场景中,容器有了跨主机(即分布式)的使用需求,而且可能容器数量庞大,拓扑关系复杂。手动操作方式的低效和不可移植性是个严重的应用障碍。Docker容器的编排和部署工具在这种背景下应运而生,Fig/Compose,Machine,Swarm,Fleet,Kubernetes都属于此类。

编排即依赖关系管理,部署则是在目标机器上按依赖关系进行动作。通过编排和部署工具,可以在一个新的环境上快速重现容器的配置和集群。

  • Compose侧重于单机环境的Docker的编排部署,管理对象的基本单位是容器;
  • Machine侧重于跨宿主机环境的部署管理,管理对象的基本单位是宿主机;
  • Swarm侧重于集群环境的部署管理,管理对象的基本单位是具有相同标签属性的多台宿主机的集群;
  • Fleet侧重于集群环境的编排部署,管理对象的基本单位是服务(全局服务单元);
  • Kubernetes除了支持集群环境的编排、部署,还支持副本管理、调度管理、存储管理、网络管理、多租户管理等特性,管理对象的基本单位是容器组(pod);

可见它们对管理对象的抽象层次越来越高,对Docker云的运维能力也是越来越强。

(完)

聊聊Docker的更多相关文章

  1. 聊聊Docker数据卷和数据卷容器

    当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...

  2. 聊聊Docker理论知识(二)

    目录 一.什么是Dcoker 二.Docker的三大核心概念 1.镜像(Image) 2.容器(Container) 3.仓库(Repository) 三.Docker架构组成 四.Docker的技术 ...

  3. 聊聊docker那些端口问题

    今天来系统聊一聊docker的端口,常见的有容器内程序端口.容器端口.主机端口.Dockerfile中EXPOSE端口.docker-compose和docker run中的port等. 貌似很多端口 ...

  4. Spring Boot工程发布到Docker

    先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...

  5. 深入浅出docker

    笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅.希望这篇随笔能帮大家入门docker.由于在海外连博客园有些慢,所以我图片用的比较少,以后再考虑一下如何更好的解决图片上传 ...

  6. Analyze a docker instance start failure

      错误信息:Cannot start container xxxxxxxxxxx | Error getting container xxxxxxxxxxxxxxx  from driver dev ...

  7. 总结对Docker这个东西的想法

    记得一开始的时候,还只能在一些网站上看到关于Docker零星的一些消息,之后的不久,有关Docker消息就遍布网络. 是什么因素让Docker火起来的? 或者说什么原因促使大家都对Docker感兴趣并 ...

  8. 深刻理解Docker镜像大小

    都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处 ...

  9. 有容云:上车 | 听老司机谈Docker安全合规建设

    编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...

随机推荐

  1. thinkpad E480 用户初体验

    梦寐以求的E480终于到手了,经过几天使用之后,也该写一下用户体验了,也算是对这些天的调研的一个总结吧. 首先是外形,从外形上来看E480的外形的确是相对以前的塑料外壳,改进了不少,全金属的机身,磨砂 ...

  2. 剑指offer随练

    合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:使用递归的方法,合并头节点,然后对剩下的链表接着合并头节点,直到合并完 ...

  3. the c programing language 学习过程3

    ControlFlow  控制流 specify 指定 compound statement 复合语句 cryptic有隐含意义的 ambiguity歧义 robust稳健 disintegratio ...

  4. Django使用模板后无法找到静态资源文件

    Django使用模板后无法找到静态资源文件 环境配置 Django版本1.11 python版本3.6.2 前言 在编写Django网站的时候,在涉及模板方面,一些简单的例子都没有问题,但这些例子都有 ...

  5. Swift 之属性setter、getter方法

    Swift 之属性setter.getter方法 Swift中的属性分为两种属性,一种就是计算型属性 一种就是存储型属性,开始我虽然知道这两种属性,但是了解并不深对于他的setter和getter方法 ...

  6. Python-ORM之sqlalchemy的简单使用

    ORM之sqlalchemy 基础章节 使用SQLAlchemy链接数据库 from sqlalchemy import create_engine from sqlalchemy.ext.decla ...

  7. Java并发系列[7]----CountDownLatch源码分析

    CountDownLatch(闭锁)是一个很有用的工具类,利用它我们可以拦截一个或多个线程使其在某个条件成熟后再执行.它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须 ...

  8. @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式

    在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...

  9. 小程序for循环中通过index实现单个点击事件

    <!--xml--> <view class='content3-list' wx:for="{{listItems}}" > <view class ...

  10. 在vue中使用css modules替代scroped

    前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules ...