专栏首页大前端开发一文让你更懂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 条评论
登录 后参与评论

相关文章

  • Node.js服务端开发教程 (二):新的软件交付方式

    在上文中,我们从零开始安装了必需的一些NestJS开发环境,并使用命令行工具生成了第一个NestJS服务端程序,而且也初步了解了怎么把这个程序运行起来。

    一斤代码
  • 让用户帮你把产品做得更好

    在互联网产品的开发和运营中,及时了解广大的实际用户的想法是极其重要的一件事情,任何产品都不可能一直采用闭门造车的方式向前走。

    一斤代码
  • 让前端10分钟就能入门Docker!

    Docker是现如今非常流行的一种容器化打包和发布工具,配合Git、SVN等代码版本管理工具,Jenkins、Gitlab Runner等持续集成工具,以及Sw...

    一斤代码
  • Docker 初次见面

    最近比较奇怪的事情就是,我一个英语四级都没过的人,居然恬不知耻的加入什么腾讯云的翻译社,翻译技术文章。结果当然是很奇妙的,一边死命的拿翻译工具机翻,一遍查阅资...

    李郑
  • Docker基础--概念扫盲

    学习使用Docker之前,有必要做一下功课,对相应的概念有一个基本、清晰的了解,这样也有助于帮助自己更好的使用。这篇文章主要介绍以下知识:

    河岸飞流
  • 容器化之Docker小知识普及

    Docker确实是个好东西,相当于一个小型虚拟机,里面环境隔离只要有对应的镜像就能运行业务应用、运行基础应用、能跑数据库等等,还能跑linux等等。

    kubernetes中文社区
  • Docker操作实践(3):Docker的操作详解

    http://bingohuang.com/simplify-docker-image-2/

    嘉为科技
  • Docker 初次见面

    Docker没有官方中文文档(至少目前为止没有,2018/1/1),所以只能通过搜索引擎加上我自己的了解来说一下。

    李郑
  • Docker相关概念介绍

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2...

    诺浅
  • Docker 入门

    Docker 使用 Google 公司推出的 Go 语言 进行开发实现,诞生于2013年初。基于 Linux 内核的 cgroup,namespace,以及 A...

    分母为零

扫码关注云+社区

领取腾讯云代金券