专栏首页大前端开发一文让你更懂Docker

一文让你更懂Docker

在之前的文章中,给大家介绍了如何使用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的使用,谢谢关注。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 让Json更懂中文(JSON_UNESCAPED_UNICODE)

    我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量....

    joshua317
  • 一文让你完全弄懂Stegosaurus

    国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我...

    Angel_Kitty
  • 一文让你彻底搞懂`__str__`和`__repr__`?

    我们都知道,Python的内置函数repr()能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。repr()就是通过__repr__这个...

    宇宙之一粟
  • 让你的编译器更懂你,写出更棒的Swift

    自从Swift诞生以后,苹果就一直在努力让它变得更好,更快。相比更加灵活的Objective-C,Swift显得更加老实本分。但是,如果你真的对它了解之后,你会...

    100000798482
  • 六个问题让你更懂 React Fiber

    很多人都摸不透React,看不懂源码,甚至不想看源码(确实很难看懂啊!),"霸王硬上弓" 肯定是不行呀,不如从React的整体架构或者说从最核心的Fiber开始...

    Sneaker-前端公虾米
  • 一文让你读懂Java类加载机制!

    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类...

    Java_老男孩
  • 一篇文章让你弄懂SpringMVC 拦截器

    第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口

    Java编程指南
  • 一篇让你搞懂 Nginx

    出处:blog.csdn.net/yujing1314/article/details/107000737

    后端码匠
  • 一文让你秒懂AQS,附带源码剖析!

    AbstractQueuedSynchronizer,简称AQS,是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量、事件等)的基础框架类。

    程序猿DD
  • 一篇文章让你彻底弄懂SSL/TLS协议

    SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码,消息认证码,公钥密码,数字签名,伪随机数生成器...

    程序那些事
  • 一篇文章让你弄懂Java的三种代理

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即...

    Java编程指南
  • 一篇文章让你搞懂原型和原型链

    与多数面向对象的开发语言有所不同,虽然JavaScript没有引入类似类的概念(ES6已经引入了class语法糖),但它仍然能够大量的使用对象,那么如何将所有对...

    葡萄城控件
  • 想要成为前端Star 吗?一首歌时间将React/Vue 应用Docker 化

    应用部署从刀耕火种,到DevOps崛起,原来不止前端在迅捷发展。接下来,我将用一首歌的时间,带大家真实的体验一番Docker容器化。

    前端劝退师
  • 一文搞懂Swagger,让你明白用了Swagger的好处!!!

    框架师
  • 一文让你看懂内存与CPU之间的关系

    主存(RAM) 是一件非常重要的资源,必须要认真对待内存。虽然目前大多数内存的增长速度要比 IBM 7094 要快的多,但是,程序大小的增长要比内存的增长还快很...

    淘课之家
  • 一篇文章让你搞懂K8s Ingress,Traefik 2.0为例(上)

    了解K8s的同学应该都知道,如果想要把应用暴露到公网上供外部访问,那么不可避免的会接触到Ingress资源。本文以Traefik为例,让大家对Ingress和T...

    100000798482
  • 一文搞懂Swagger,让你明白用了Swagger的好处!!!

    框架师
  • 一文讲述人工智能在医疗行业的九个落脚点,让你更懂AI

    翻译 | AI科技大本营(rgznai100) 参与 | 史天 很多思想领袖认为我们正在经历第四次工业革命。这次工业革命融合了物理世界、数字世界和生物世界,将影...

    AI科技大本营
  • 用CSS让你的文字更有文艺范

    桃翁

扫码关注云+社区

领取腾讯云代金券