给Docker专题开个头,这篇用来介绍一下Docker。

虚拟化与容器

要想了解Docker,我们得先了解虚拟化和容器。

在早期时候,一套应用程序部署起来大致分为以下步骤:
1. 设置服务器:安装操作系统、配置网络和安全设置。
2. 安装依赖:安装应用程序所需的各种库和依赖软件。
3. 部署应用:将应用程序代码部署到服务器上。
4. 配置应用:配置环境变量、数据库连接等参数。
5. 运行和维护:启动应用程序并进行日常维护和更新。

存在的缺点:
1. 环境差异:开发、测试和生产环境可能存在差异,导致应用程序在不同环境下表现不一致。
2. 依赖冲突:多个应用程序可能需要不同版本的依赖库,容易导致冲突。
3. 资源利用率低:每个应用程序占用整个服务器或虚拟机的资源,资源利用率低。
4. 部署复杂:每次部署都需要重复进行复杂的配置和安装过程。

举个形象的栗子:早期的时候,手机上只能装一个微信,如果还想登录另一个微信账号,就需要退出当前账号,登录另一个账号。这样就没法同时使用两个微信账号,所以为了使用两个微信,你需要购买两台手机,这样就增加了硬件成本,以及维护成本。

于是就有了虚拟化。

虚拟化技术的目的是希望能够截获上层操作系统应用对硬件资源的访问,然后重定向到 VMM 的资源池中,再由 VMM 来对下层资源进行管理。

是不是不好理解,简单来说,就是在一台物理服务器上在运行一个操作系统级别的程序,简称虚拟机。虚拟机拥有和物理机一样的CPU、内存、磁盘、网卡等属性,可以像使用物理服务器一样使用这台虚拟机。

而且每个虚拟机之间是相互隔离的:在一台物理服务器上创建多个虚拟机,然后分别在这些虚拟机上部署应用,并且相互之间不会影响。

就比如手机上的微信分身,两个微信共存在同一个手机上,并且相互之间的数据不会冲突。这样就不用购买两台手机,节约了成本,提高了资源利用率。这对一个企业来说是非常重要的。


历史告诉了我们,虚拟化技术极大的促进了云计算的发展,但是在实际生产环境中,使用虚拟机部署应用的方式并不理想:
企业通过购买大量服务器,部署私有云平台,利用虚拟机的方式部署应用程序。首先一个是技术上的难关,大多企业采用OpenStack、ESXi等开源方案来构建云平台,但实际产出的虚拟机性能低下,故障率高。其次对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我们都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。

那么有没有其他什么方式能让人更加的关注应用程序本身,底层多余的操作系统和环境我可以共享和复用?

换句话来说,那就是我部署一个服务运行好后,我再想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境。

这就像集装箱运载一样,我把货物————兰博基尼跑车(好比开发好的应用APP),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS8.0环境)运送到纽约码头(Ubuntu22.04环境)。而且运输期间,我的兰博基尼(APP)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美的赛跑(启动正常)。

容器技术就解决了这个问题。

容器的特点其实我们拿跟它跟硬件抽象层虚拟化hypervisor技术对比就清楚了,我们之前也提到过,传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。那么有了容器技术就简单了,总结下容器技术主要有四个特点:
1. 极其轻量:只打包了必要的Bin/Lib;
2. 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
3. 易于移植:一次构建,随处部署;
4. 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

Docker

当前,Docker几乎是容器的代名词,很多人以为Docker就是容器。其实,这是错误的认识,除了Docker还有coreos。
Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

想要搞懂Docker,其实看它的两句口号就行。

第一句,是“Build, Ship and Run”。也就是:“搭建、发送、运行”,三板斧。

举个例子:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。
等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。

怎么样?是不是很神奇?
所以,Docker的第二句口号就是:“Build once,Run anywhere”。意思是:搭建一次,到处能用。

Docker技术的三大核心概念,分别是:
镜像(Image)
容器(Container)
仓库(Repository)

刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。

每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!

也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。

这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?

于是乎,就变成了一个大的公共仓库————负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?

所以,Docker Registry服务对镜像的管理是非常严格的。

最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

下面是Docker和虚拟化两种方案的对比:

总的来说,Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

Docker优点总结:

快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://thechen.work/subject/article/slug_docker/

许可协议:署名-非商业性使用 4.0 国际许可协议