什么是Docker?

简介: 什么是Docker?

在轻松打包、部署和运行分布式应用程序方面,Docker 已成为 IT 行业的标准。Docker 的主要优点是它允许用户将应用程序及其所有依赖项打包到一个称为容器的标准化单元中。
由于 Docker 是一个容器化平台,因此了解容器化背后的历史非常重要。


容器化之前的历史


在容器化出现之前,隔离、组织应用程序及其依赖项的主要方法是将每个应用程序放在自己的虚拟机中。这些机器在同一个物理硬件上运行多个应用程序,这个过程只不过是虚拟化。

但是虚拟化几乎没有缺点,例如虚拟机体积庞大。运行多个虚拟机会导致性能不稳定。启动过程通常需要很长时间,VM 无法解决可移植性、软件更新或持续集成和持续交付等问题。

这些缺点导致了一种称为容器化的新技术的出现。

容器化是一种将虚拟化带到操作系统级别的虚拟化。虚拟化为硬件带来了抽象,而容器化为操作系统带来了抽象。


容器与虚拟机


术语“容器”和“虚拟机”经常互换使用,然而,这往往是一种误解。但是,两者只是提供操作系统虚拟化的不同方法。


虚拟机


通常包括完整的操作系统、操作系统包,如果需要,还包括少量应用程序。这是通过为虚拟机提供硬件虚拟化的管理程序实现的。这允许单个服务器作为虚拟来宾运行许多独立的操作系统。一般来说,虚拟机是一个完全类似于计算机的系统。


容器


类似于虚拟机,只是容器不是完整的操作系统。容器通常只包含必要的操作系统包和应用程序。它们通常不包含完整的操作系统或硬件虚拟化,这就是它们“轻量级”的原因。


而容器通常用于隔离单个主机内正在运行的进程,以确保隔离的进程无法与同一系统内的其他进程交互。容器之间的沙箱进程。现在,您可以将 Docker 容器视为虚拟机的轻量级等价物。Docker 可以尽可能轻松地创建和使用容器。


使用 Docker 容器的原因


容器没有来宾操作系统并使用主机的操作系统。因此,他们会在需要时共享相关的库和资源。

应用程序隔离:如果你想在一台服务器上运行多个应用程序,将每个应用程序的组件保存在单独的容器中可以防止依赖管理出现问题。

由于应用程序特定的二进制文件和容器库在主机内核上运行,因此应用程序的处理和执行速度非常快。

启动一个容器只需要几分之一秒。

容器比虚拟机轻量级且速度更快。


什么是 Docker 容器?


Docker 是一个以容器的形式将应用程序及其所有依赖项打包在一起的平台。它使用容器使应用程序的创建、部署和运行变得更加容易。Docker 在容器内绑定应用程序及其依赖项。


容器允许开发人员将应用程序及其所需的所有部分(例如库和其他依赖项)打包在一起,然后将其作为一个包发送出去。


假设您需要构建一个应用程序。为了使该应用程序可供公众使用,您需要在某个地方托管它。过去,您需要构建自己的计算机。您需要设置一个名为“server”的专用 Web 服务,它基本上是一台专用于托管网站或 Web 服务的计算机。但是,您的应用程序开始时可能只有大约 300 兆字节的大小。那么,当您的应用程序远小于 1GB 大小时,您为什么想要一个“虚拟机”,它是由虚拟化产生的虚拟化环境?


这就是“容器”的概念来解决这个问题的地方。Docker 通过以下方式完成它。不需要为每个应用程序托管每个操作系统,而是可以共享一些公共资源,并且有一种叫做“docker 引擎”的东西,它位于操作系统之上。


d660687cbcde414bbd6864a0942ea11f.png

采用 Docker 或容器的结果是可以更快地部署或取消部署应用程序。更快地开始和停止,更快地转换到另一个“image”,更快地处理和做很多事情。


Docker 生态系统中元素和工具


Dockerfile


Dockerfile 是一组精确的指令,说明如何创建新的 Docker 镜像。为基于它运行的容器设置默认值等等。它是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。因此,Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。


Docker Image(映像)


Docker Image 可以比作用于创建 Docker 容器的只读模板。Image是一个蓝图,可以从中启动任意数量的全新容器。没有“当前运行的命令”保存在Image中。当您启动容器时,有点像在关闭电源后启动机器。


Docker Container(容器)


它是 Docker Image 的运行实例,因为它们包含运行应用程序所需的整个包。


想象一下,您想运行一个与系统上其他所有内容隔离的命令。它应该只访问它被允许访问的资源,并且不知道机器上还有其他任何东西。在容器内运行的进程认为它是唯一的进程,并且只能看到一个准系统的 Linux 发行版,这些内容在图像中描述。


运行容器的机器不应该过多关心里面的内容,而 dockerized 应用程序并不关心它是在Kubernetes 集群还是单个服务器上——它无论如何都能运行。


一个容器一次可以运行多个进程。您可以将许多服务打包到一个容器中,并让它们并排运行。


当一个 Docker 容器被删除时,重新启动镜像将启动一个新的容器,而不会对之前运行的容器进行任何更改——这些更改将丢失。


f54abb54b4444efe9ebad310bdcea323.png

Docker Volume(数据卷)


容器默认不会留下任何东西。对容器所做的任何更改(假设您没有将其另存为 Image)都会在删除后立即丢失。


为了能够保存(持久化)数据并在容器之间共享数据,Docker 提出了Volume(数据卷)的概念 。很简单,Volume是默认文件系统之外的目录(或文件),并作为主机文件系统上的普通目录和文件存在。


Docker Volume使我们能够保存数据并在容器之间共享。

相关文章
|
人工智能 机器人 Serverless
魔搭大模型一键部署到阿里云函数计算,GPU 闲置计费功能可大幅降低开销
魔搭大模型一键部署到阿里云函数计算,GPU 闲置计费功能可大幅降低开销
1140 2
|
JavaScript 前端开发 测试技术
拥抱开源:NestJS 在现代后端开发中的应用
【10月更文挑战第21天】NestJS 是一个基于 TypeScript 的现代 Node.js 框架,结合了 OOP、FP 和 FRP 元素,支持模块化设计、控制器、服务和守卫等核心概念,具备强大的依赖注入系统。本文探讨了 NestJS 的核心特性、应用场景及其在现代后端开发中的价值,包括构建 RESTful API、微服务、单页应用后端和企业级应用。通过最佳实践和社区支持,NestJS 可显著提高开发效率和代码质量。
|
存储 安全 前端开发
Elasticsearch 使用误区之六——富文本内容写入前不清洗
【10月更文挑战第6天】在大数据和全文搜索领域,Elasticsearch(简称ES)凭借其强大的搜索和分析能力,成为众多企业和开发者的首选工具。然而,在实际应用中,很多开发者在使用ES时存在一些误区,其中之一便是富文本内容写入前不进行清洗。本文将深入探讨这一误区,并提供一些实用的清洗策略和最佳实践。
227 3
|
关系型数据库 分布式数据库 数据库
基于PolarDB Ganos的实时时空计算:电子围栏篇
文章着重介绍了PolarDB Ganos如何应用于实现实时电子围栏计算。这是一种依赖于位置技术来创建虚拟地理边界的解决方案,广泛应用于交通安全、应急管理、营销推广等多个领域。通过与阿里云实时计算Flink版产品的集成,PolarDB Ganos能够高效地进行空间计算和数据分析,显著提高了地理围栏应用的实时性和准确性。文章还提供了使用Ganos进行电子围栏计算的实际步骤、性能测试及优化建议,并强调了PolarDB Ganos在提高数据处理效率和降低成本方面的优势。
|
存储 算法
【博士每天一篇文献-算法】On tiny episodic memories in continual learning
本文研究了在连续学习环境中使用小型情节记忆来解决灾难性遗忘问题,通过实证分析发现经验重播(ER)方法在连续学习中的表现优于现有最先进方法,并且重复训练对过去任务的小型记忆可以提升泛化性能。
175 1
【博士每天一篇文献-算法】On tiny episodic memories in continual learning
Qt 之未定义标识符“qFlagLocation“解决办法
Qt 之未定义标识符“qFlagLocation“解决办法
|
存储 安全 网络安全
网络安全威胁——计算机病毒
网络安全威胁——计算机病毒
|
缓存 Linux 数据库
linux系统中buff/cache占用过高?不明白为何过高?
linux系统中buff/cache占用过高?不明白为何过高?
2879 1
|
存储 缓存 前端开发
Android Github 上面优秀的两种阴影方案,完美兼容高低版本问题
Android Github 上面优秀的两种阴影方案,完美兼容高低版本问题
|
XML 监控 测试技术
Locust:简介和基本用法
如果要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不需要这样做,因为主机默认为127.0.0.1):
Locust:简介和基本用法