Docker(build once, run anywhere)

目录

1.Docker容器技术解决了什么问题

1.1传统部署

1.2虚拟机部署

🚀解决第一个问题——储存过大(镜像过大)

🚀解决第二个问题——启停过慢

🚀解决第三个问题——性能损耗

2.容器与虚拟机(VM)

2.1 CONTAINERS

2.2 VIRTUAL MACHINES

3.Docker镜像

4.dcoker注册表

注册表与存储库

5.Docker Compose


1.Docker容器技术解决了什么问题

Docker 解决了程序部署运行的问题。传统方式是直接将程序部署到物理服务器,而 Docker 则利用容器技术,将程序及其依赖环境打包成镜像,作为独立单元进行管理。Docker 提供了用户友好的界面,简化了操作,实现了“一次构建,随处运行”(build once, run anywhere)。它通过容器镜像标准化了软件交付,将软件部署的复杂性封装在镜像中,使用者无需关注内部细节,从而彻底改变了软件部署和分发模式

1.1传统部署

直接管理业务程序的启停方便,但忽略了依赖管理多台机器部署时,依赖复杂且易变,而且不同程序版本依赖冲突,导致部署繁琐且易出错。 解决思路是将程序及其所有依赖打包成一个独立单元,例如每个程序版本独占一台机器,这个机器完全为这个程序服务, 从而简化部署和管理。

1.2虚拟机部署

为解决程序版本和依赖冲突,最初采用虚拟机部署方案,将程序及其依赖打包到虚拟机镜像中。但虚拟机镜像庞大、启动慢、性能损耗大,成本和效率低。因此,未来的目标是在解决依赖问题的同时,克服虚拟机部署的缺点,寻求更优的方案。

🚀解决第一个问题——储存过大(镜像过大)

容器技术源于轻量级虚拟机的思路,旨在解决虚拟机镜像过大的问题。其核心是利用多个虚拟机或虚拟机与宿主机操作系统间大量重复文件的特性,通过Copy-on-Write机制,即只保存一份共享文件,修改时再复制给做出修改的虚拟机,从而节省存储空间

🚀解决第二个问题——启停过慢

虚拟机之所以启停速度慢,是因为虚拟机的启动和停止速度比容器技术慢的原因主要在于:虚拟机启停包含了整个操作系统的启动流程;容器启停相当于进程级别的启停。每次启动或停止虚拟机时,都需要经历操作系统的启动和关闭过程,这增加了额外的时间开销。

相比之下,容器技术在保持隔离的前提下,只需要启动程序进程本身,不需要启动整个操作系统,因此启停速度明显更快。容器技术利用了namespace和c groups等隔离技术,这些技术在2008年已经基本发展成型,早于Docker等容器技术的出现。通过这些轻量化的隔离手段,容器技术能够解耦操作系统本身冗余的部分,只关注进程本身的启动和停止,从而提高了启停速度。

此外,容器内的进程共用内核,不需要维护独立的内核,减少了重复和冗余的开销,进一步降低了性能损耗。而虚拟机技术在硬件层面的损耗也较大,早期的虚拟机技术在这方面的损耗尤为明显。

总结来说,虚拟机的启停速度慢主要是因为包含了操作系统的启动和关闭过程,而容器技术通过轻量化的隔离手段和共用OS内核的方式,显著提高了启停速度。

🚀解决第三个问题——性能损耗

容器技术通过共用宿主机的内核来解决性能损耗问题。具体来说,容器内的所有进程共享宿主机的操作系统内核,不需要为每个容器维护独立的内核,从而消除了重复和冗余的开销。这种轻量化的方式减少了操作系统层面上的行为重复和冗余,降低了硬件资源的使用损耗,进而提高了程序的性能,这是软件虚拟化损耗,而对于硬件虚拟化损耗,虽然早期硬件虚拟化存在损耗,但随着技术发展,这些损耗已大幅降低,最终可望完全消除,标志着容器技术的成熟。

2.容器与虚拟机(VM)

技术虚拟化对象
Docker容器操作系统级别的虚拟化:容器虚拟化的是操作系统内的用户空间,直接共享宿主机的内核。
虚拟机硬件级别的虚拟化:虚拟化的是整个硬件资源,运行自己的完整操作系统,包括内核和应用。

容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件

2.1 CONTAINERS

容器是应用程序层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器比虚拟机占用更少的空间(容器映像的大小通常为几十Mb),可以处理更多的应用程序,并且需要更少的虚拟机和操作系统。

2.2 VIRTUAL MACHINES

虚拟机(vm)是物理硬件的抽象,可以将一个服务器转换为多个服务器。管理程序允许在一台机器上运行多个虚拟机。每个VM包括操作系统、应用程序、必要的二进制文件和库的完整副本——占用数十GB的空间。虚拟机也可能启动缓慢。

  • 镜像庞大 (数十GB)

  • 启停速度慢

  • 性能损耗大

3.Docker镜像

容器是一个标准的软件单元,它将代码及其所有依赖项打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境。

Docker容器镜像是一个轻量级的、独立的、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时间、系统工具、系统库和设置。

以Docker容器为例——当映像在Docker引擎上运行时,它们就变成了容器。容器化软件可用于Linux和基于windows的应用程序,无论基础设施如何,都将始终以相同的方式运行。容器将软件从它的环境中隔离出来,并确保它能够统一地工作,尽管在开发和阶段之间存在差异。

镜像有两个重要的原则:

  1. 图像是不可变的。图像一旦创建就无法修改。您只能制作新图像或在其上添加更改。

  2. 容器镜像由层组成。每个层代表一组添加、删除或修改文件的文件系统更改

在Docker引擎上运行的Docker容器:

  • 标准:Docker为容器创建了行业标准,因此它们可以移植到任何地方

  • 轻量级:容器共享机器的操作系统内核,因此不需要每个应用程序一个操作系统,从而提高了服务器效率,降低了服务器和许可成本

  • 安全:容器中的应用程序更安全,Docker提供了业界最强的默认隔离功能

4.dcoker注册表

现在您已经知道什么是容器映像以及它是如何工作的,您可能想知道 - 将这些映像存储在哪里?

镜像注册表是用于存储和共享容器镜像的集中位置。它可以是公共的或私人的。 Docker Hub是一个任何人都可以使用的公共注册表,并且是默认注册表。

注册表与存储库

当您使用注册表时,您可能会听到注册表存储库这两个术语,就好像它们是可以互换的一样。尽管它们有相关性,但它们并不完全相同。

注册表是存储和管理容器映像的集中位置,而存储库是注册表中相关容器映像的集合。将其视为一个文件夹,您可以在其中根据项目组织图像。每个存储库都包含一个或多个容器映像。

5.Docker Compose

如果您运行多个容器,如何将它们连接在一起?

容器的一个最佳实践是每个容器应该做一件事并且做好。尽管这一规则也有例外,但请避免让一个容器执行多项操作的趋势。

您可以使用多个docker run命令来启动多个容器。但是,您很快就会意识到您需要管理网络、将容器连接到这些网络所需的所有标志等等。完成后,清理工作会稍微复杂一些。

使用 Docker Compose,您可以在单个 YAML 文件中定义所有容器及其配置。如果您将此文件包含在代码存储库中,则克隆您的存储库的任何人都可以使用单个命令启动并运行。

重要的是要理解 Compose 是一个声明性工具 - 您只需定义它并运行即可。您并不总是需要从头开始重新创建所有内容。如果您进行了更改,请docker compose up再次运行,Compose 将协调文件中的更改并智能地应用它们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值