首页 > 编程知识 正文

Docker原理

时间:2023-05-06 20:10:03 阅读:271888 作者:4336

简介

最近几年Docker非常火爆,听起来很高大上,说他彻底释放了计算机虚拟化,它的优点有持续集成、版本控制、可移植性、隔离性和安全性,那么它实现逻辑是什么样的呢,只有当我们理解了它的实现逻辑,就知道他为什么有那么多的优点。

Docker历史简介

docker,码头搬运工,码头搬运工处理的是一个个集装箱,集装箱的目的是更方便移植物品。这里的docker当然不是码头搬运工,他是一个开源项目,Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,当它把自己的代码开源后,让Google不爽了,因为在Docker开源前,Google内部也有自己的容器技术,已经闷声发大财很长时间了,Google就在其中搅局,这样Docker如果还想继续发展下去,决定一个技术的发展方向,就必须拿到容器规范的制定者角色,需为了拿到容器技术的制定规范,Docker不得不含着泪开源了很多技术,而最终拿到了OCI(Open Containers Initiative)规范的制定权。

docker主要是一个容器管理工具,早期的docker是使用lxc,后来自主研发了一个libcontainer来取代lxc,最后发展为runC。对于启动和运行容器根据OCI标准。

实现原理

Docker 包括三个基本概念

镜像(Image)容器(Container)仓库(Repository)
如果理解了这三个概念,就理解了Docker的运作原理了。 容器

我们都知道,操作系统分为内核和用户空间,容器的实现,是使用的宿主机的内核,然后自己虚拟出来一个自己的用户空间,以分割一个一个的应用。

容器,最早的实现是LXC,Docker本来的发展就是基于lxc进行的,我们这里要有一个概念就是,docker本身不是容器,其只是容器的管理工具,并且可以让容器可迁移。

镜像

容器要生成,要生成一个新的用户空间,依靠什么呢?就是镜像了。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
分成存储
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

仓库

镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。默认官方就提供的有,网址https://hub.docker.com/。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

具体docker实现逻辑拓扑


上面的图就是Docker的实现逻辑。
Client <–> Daemon <–> Registry Server

docker的运行是c/s架构,使用client来进行管理docker服务端,在服务端,开启一个daemon来进行接收client的管理。容器的运行主要是依靠本地的images,images是从哪里来的呢?
1、可以自己制作,难度大,不切实际,官方已经提供了一些基础镜像,在这些基础镜像上创建镜像即可。
2、可以基于某个已经存在的镜像使用Dockerfile来进行制作。
3、可以在已经运行过,有操作痕迹的容器上进行commit操作来构建。
4、也可以从官方或者第三方(registry)直接获取。官方的registry网址是https://hub.docker.com/。

传统虚拟机的对比

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。

(摘录自网上)

为什么要使用Docker

既然说了这么多,Docker有这么多的特性,我们具体为什么要使用Docker,出于什么目的我们可以来使用Docker呢?

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像的可迁移性,可在相同内核上任意迁移,即软件运行环境可任意迁移。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在
很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

持续交付和部署

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员
可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,可以和git很好的结合,来实现应用程序环境的“版本控制”。

隔离性

Docker使用独立的用户空间,应用程序运行在独立的用户空间,如果你想在服务器上直接删除一些应用程序是比较困难的,因为这样可能引发依赖关系冲突。而Docker可以帮你确保应用程序被完全清除,因为不同的应用程序运行在不同的容器上,如果你不在需要一款应用程序,那你可以简单地通过删除容器来删除这个应用程序,并且在你的宿主机操作系统上不会留下任何的临时文件或者配置文件。
Docker还能确保每个应用程序只使用分配给它的资源(包括CPU、内存和磁盘空间)。一个特殊的软件将不会使用你全部的可用资源,要不然这将导致性能降低,甚至让其他应用程序完全停止工作。

安全性

从安全角度来看,Docker确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。

希望我的讲解可以让你理解docker原理的同时,理解其优势。如果讲述有错误,希望我们可以讨论交流^_^.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。