前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文让你更懂Docker

一文让你更懂Docker

作者头像
一斤代码
发布2020-06-01 10:36:05
9970
发布2020-06-01 10:36:05
举报
文章被收录于专栏:大前端开发大前端开发

在之前的文章中,给大家介绍了如何使用Docker打包前端项目的知识,可能通过一通实操,你已成为一名会使用Docker的程序员。不过老实说,之前的内容还不足以让你懂Docker。因此,今天想来继续做科普,让大家了解Docker到底是个什么东西,以及使用Docker的一些初衷。

它是一种虚拟化技术

简单来说,通过虚拟化的方式,可以将一个物理计算资源(比如CPU、磁盘、网络等)虚拟成多个逻辑计算资源,让多个逻辑计算资源可以在这个物理计算资源上同时运行,并相互独立互不影响,从而提高资源的利用效率。而且通过虚拟化技术,可以做到硬件资源容量的动态扩容,也可以简化软件的重新配置过程,能显著提高工作效率。

Docker所代表的容器技术,它们的目的当然也是如此。

它是容器:一种轻量级的虚拟化技术

轻量级,是相对于传统的虚拟机(Virtual Machine,简称VM)技术来说的。我们来看一张图,以方便了解Docker所使用的容器技术和传统虚拟机技术在运行模型上的差别:

左图代表的是一台运行着虚拟机的宿主计算机,而右图是运行着Docker容器的宿主计算机。

虚拟机和容器的创建与管理工作都是由专门的管理程序来执行,比如虚拟机的话,你一定用过或听过VirtualBox、VMWare Workstation,它们可以用来管理虚拟机镜像、创建和运行虚拟机实例、配置虚拟机可使用的资源等等;而在Docker中,类似这部分的相应工作,是由Docker引擎来完成的。

然后,我们可以观察到:在运行的虚拟机和容器中,除了都包含有应用程序、二进制程序(系统程序、系统工具等)、链接库(动态链接库、静态链接库),一个非常明显的区别就是在运行的虚拟机中包含有操作系统,而容器中却没有。虚拟机正因为带有独立的操作系统,它可以通过这个操作系统内核进行对硬件资源的自主访问,成为一个独立完备的计算机小生态;而Docker容器则不具备这样的功能,它只能通过与宿主机共享操作系统内核来进行硬件资源的访问。但是这也不是Docker的缺点,反而因为不需要携带自己的操作系统,容器变得更小更轻量,创建容器变得非常快速。


题外话:

可能有很多已经用Docker一段时间的朋友会有疑问,那些ubuntu、centos或alpine之类的镜像是啥?难道不是操作系统吗?我们知道Linux有很多的发行版,上面所说这些就是Linux众多发行版中的成员,而一个发行版里面包含的内容:

Linux发行版 = Linux内核 + 系统级软件 + 应用软件 + 默认配置

不同的发行版中包含的操作系统内核其实都是那位Linux大神维护的那个,不同部分只是后面的那三样(系统级软件、应用软件、默认配置)。而在创建Docker镜像的时候,我们使用某个Linux发行版的目的,只是为了使用该发行版中带有的后面那三样东西。在容器运行的时候,它使用的内核都是宿主机操作系统的。


关注首发公众号:默碟

为什么使用Docker?

一种技术的采用,一定有它适合的场景和优势。容器技术的流行原因,总结下来可能主要归功于以下的这些特性:

一、秒级启动

跟传统虚拟机相比,由于不需要额外启动一个操作系统,容器直接使用已经启动好的宿主机内核,所以启动过程非常的快速,达到秒甚至毫秒级别。可为日常的开发部署工作节约大量时间。

二、资源利用率高

也正因为不需要运行额外的操作系统,使得容器可以更少的占用各项资源,节省出更多的资源去运行更多的应用程序。所以,同样配置的硬件上面通常可以比虚拟机运行更多的应用。

三、环境一致

开发界最著名的问题就是“在我本地是好的呀!”。这个问题其实大多数情况都是由于开发、测试、生产环境中的代码、依赖库和配置等不一致所造成的。使用容器可以很好的解决这个问题,在制作容器镜像的时候所有内容都可以被固定下来,最大程度减少外部依赖,因此在任何机器上运行容器都保持着高度的一致性。

四、方便复用

通过镜像分层技术,可以很容易的定制出可复用度高的基础镜像,然后可以进一步扩展,方便协作和共享。我们可以在公共镜像库中找到大量各种高质量的镜像,有官方团队维护的,也有其他开源团队维护的。使用这些镜像作为我们的基础镜像,可以节省很多工作时间。

五、轻松迁移

由于Docker的环境一致性,使得它可以很容易的运行在各种各样的平台上,只要安装有Docker的机器,就能保证容器能行为一致的运行其上。

三个基本概念:镜像、容器、仓库

要了解Docker的话,就一定要先知道Docker中的这三个最基本的概念。

镜像

说到镜像(Image),就得一起提镜像层(Image Layer)这个概念。其实本质上这两个东西都是一样的,它们都是文件系统,存储着我们的程序和数据文件等等信息。镜像层可以理解为基本的镜像。可以通过组合多个镜像层生成一个新的镜像;也可以将一个镜像作为一个镜像层,成为组合别的镜像的一份子。

一个镜像中的所有镜像层都是只读的。它们互相堆叠在一起,每一层都指向它的父层,通过统一文件系统(UnionFS)技术隐藏多层的存在,成为一个整体的文件系统。

容器

再来说容器(Container)。其实,容器和镜像几乎一模一样,它也是一个文件系统,唯一的区别之处就在于:在所有只读层的最外面增加了一层可读写层,用于向容器内写入数据。

这么看来,容器就相当于往镜像上添加了一个可读写层。其实,这个可读写层也是可以通过某种手段被转换成只读层的(玩过Docker的朋友可能会立马想到 docker commit),这样就可以实现更改容器中的内容后,再将其转换成新的镜像。

到这里,我们终于知道了,容器和镜像一样,都是一个静态的概念,是文件系统。

而容器被运行起来的时候,才会成为一个称作运行态容器的东西,如下图所示:

运行态容器是由静态容器、一个隔离的进程空间、以及运行于其中的程序进程所组成。我们通常用docker run运行起来的其实就是运行态容器,而使用docker stop停止后的容器,就是静态容器。

仓库

最后,就来说下最好理解的仓库(Repository)了。仓库分为本地仓库和远程仓库,是用于存储镜像的地方。我们通常在一台电脑上通过docker build构建镜像后,镜像就被存放在本地仓库中;当我们要转移、分发这些镜像的时候,就需要利用远程镜像仓库,将镜像上传,以便后续其他电脑可以从这些远程仓库中下载到我们的镜像。

总结

本文作了一个关于Docker的最基础的概要介绍,虽然Docker中涉及的内容远非这些可以概括,但却是入门Docker的重要知识。本人在编写此文的时候,也重新认识和领悟了很多新知识,相信对你们也同样有所启发。

后续会继续通过实操的方式分享Docker的使用,谢谢关注。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 它是一种虚拟化技术
  • 它是容器:一种轻量级的虚拟化技术
  • 为什么使用Docker?
  • 三个基本概念:镜像、容器、仓库
  • 总结
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档