Docker:独具魅力的开源容器引擎

news2024/11/18 20:17:50

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

本篇内容主要介绍了:Docker 技术介绍、Docker 的基本概念与组成以及部署技术发展史。


文章目录

    • 一、Docker 技术介绍
        • 1、Docker 简介
        • 2、虚拟化技术
        • 3、Docker 优势
    • 二、Docker 的基本概念
        • 1、Docker 组成部分
        • 2、Docker 镜像
        • 3、Docker 容器
        • 4、Docker仓库
    • 三、部署技术发展史
        • 1、物理机时代
        • 2、VMware 时代
        • 3、容器化时代
        • 4、Docker 时代
        • 5、Kubernetes


一、Docker 技术介绍

1、Docker 简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

img

Docker 的开源项目诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc 。

2、虚拟化技术

在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。

3、Docker 优势

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势:

  1. 更快速的交付和部署: Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间;
  2. 更高效的虚拟化:Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率;
  3. 更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个;
  4. 更简单的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

二、Docker 的基本概念

1、Docker 组成部分

Docker 的架构图:

image-20230111193611356

一个完整的 Docker 主要由以下几部分构成:

组成部分
1Docker 主机Docker 主机(Host)是可以是一个物理机或者虚拟机,用于运行 Docker 服务进程和容器
2Docker 服务端Docker 服务端(Server)也叫 Docker Daemon 其实就是 Docker 的服务端。它负责监听 Docker API 请求(如 Docker Client)并管理 Docker 对象(Docker Objects),如镜像、容器、网络、数据卷等
3Docker 客户端Docker 客户端(Client)是用户与 Docker 进行交互的最主要方式。当在终端输入 Docker 命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client 除了连接本地服务端,通过更改或指定 DOCKER_HOST 连接远程服务端
4Docker 镜像Docker 镜像(Images)可以理解为是是用于创建 Docker 容器的模板
5Docker 容器Docker 容器(Container)是独立运行的一个或一组应用,是镜像运行时的实体
6Docker 仓库Docker 仓库(Registry)是保存镜像的仓库,类似于 git 和 svn 这样的版本控制系统

2、Docker 镜像

Linux 操作系统包括 Linux 内核和用户空间两部分,当 Linux 系统启动后,会挂载 root 文件系统为其提供用户空间支持。Docker 镜像就类似于这样一个 root 文件系统,Docker 镜像中含有启动容器所需要的文件系统及所需内容,因此镜像主要用于创建并启动 Docker 容器。

Docker 镜像里包含一层层的文件系统,叫做 Union File System(Union FS,联合文件系统)。联合文件系统可以将多个目录挂载到一起,从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像是普通的 Linux 目录结构一样。Docker 通过这些文件系统,再加上宿主机的内核就构成了一个 Linux 的虚拟环境。

在联合文件系统中,每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置只读(readonly)、读写(readwrite)和写出(writeout-able)三种权限。

但是 Docker 镜像中每一层的文件系统都是只读的,构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做了一层的修改,增加了一层文件系统,这样一层一层的网上叠加,上层的修改会覆盖底层该位置的可见性。当我们使用镜像的时候,只会看到一个完整的整体,而不知道也无需知道里面有几层文件系统。

3、Docker 容器

Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。

4、Docker仓库

Docker 仓库是一个集中存储、分发 Docker 镜像的仓库,客户端的 docker pull 和 docker push 命令都是直接与 Docker 仓库发生交互的。

一个 Docker 仓库可以包含多个仓库,每个仓库可以包含多个标签,这些标签对应每一个镜像。一般情况下,一个仓库可能会包含同一个软件的不同版本(例如 Nginx 1.18 和 1.20 版本等)镜像,标签就类似于该软件的不容版本,客户端可以通过 <仓库名>:<标签> 的格式来指定具体版本的软件镜像,如不指定,默认会以 latest 作为标签。

按照镜像是否公开,Docker 仓库可分为公共仓库和私有仓库两种。Docker hub 作为 Docker 官方的公共仓库,已经保存了大量的常用镜像,可以方便用户直接使用;如果不想使用公共仓库,也可使用 Image registry 这一 Docker 官方提供的私有仓库部署工具。


三、部署技术发展史

1、物理机时代

在虚拟机出现于业务环境中以前,应用往往部署在物理机器上,但是 无论是 Windows 服务器还是 Linux 服务器都缺乏相应的技术手段保证一台服务器上可以稳定且安全的同时运行多个应用,因此,这样的部署方式存在弊端就是:空闲资源难以得到复用,部署异构系统时需要重新采购物理资源,大量中小容量的机器使得运维成本提升。

在这样的情况下,如何降低基础设施的管理成本便成为急切的需求。

2、VMware 时代

为解决上述问题,VMware 推出了他们的产品————虚拟机,虚拟机的出现使得用户在一台物理机上能够独立运行多个相互隔离的系统,通过对资源的抽象化使得主机资源能够被有效复用,这对于企业IT管理十分有益。

image-20230111193456231

然而,虚拟机同样也会带来一些问题:

  • 大量独立系统的运行会占用许多额外开销,消耗宿主机器资源,资源竞争时可能会严重影响系统响应;
  • 此外,每运行新的虚拟机都需要重新配置一遍环境,和在物理机上的情况基本无异,重复的环境配置操作则会消耗开发和运维人员的工作时间。

此时需求便关注到如何减少虚拟化时的资源损耗,同时还能保证隔离性,以及使应用的上线周期更短,这便引导了容器技术的发展。

3、容器化时代

现代的容器技术起源于 Linux ,其是很多人长期的、持续的贡献产物,自 2000 年开始各家类 Unix操 作系统厂商开始陆续推出容器相关的项目。

2008 年 Google 的 Cgroups 贡献给 Linux kernel 2.6.24 后,创造了LXC( Linux Containers),实现了多个独立的 Linux 环境(容器)可运行在同一个内核。对于一个完整独立运行环境来说,需要包含三个关键:环境隔离、资源控制和文件系统。在 LXC 中则分别通过 Namespace、Cgroups、rootfs 来实现相应的能力:

  • Namespace — 环境隔离:LXC 将内核全局资源封装,每个 Namespace 都有一份独立的资源,使得不同的进程在各自 Namespace 内对同一种资源的使用互不干扰,不会影响其他 Namespace 下的资源,实现了进程隔离;
  • Cgroups - 资源控制:LXC 通过 Cgroups 对资源进行控制,限制和隔离一组进程对系统资源的使用。在 Cgroups 出现之前 OS 只能对一个进程做资源限制,而 Cgroups 可以对进程进行任意分组,如何分组由用户自定义,借此实现对于一个 Namespace 的资源调度管理;
  • rootfs - 文件系统:rootfs 挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统。rootfs 包含一个操作系统所涉及的文件、配置和目录,在 Linux 操作系统内核启动时,内核会先挂载一个只读的 rootfs,当系统检测其完整性之后,决定是否将其切换到读写模式。

image-20230111194405307

在通过 LXC 构建容器后,一台宿主机能够实现多个相互隔离应用的运行。同时,共享内核使得每个容器又很轻量,解决了运行大量隔离应用时虚拟机资源消耗过重的弊端。

然而,LXC 虽解决了应用隔离的问题,但却只是轻量的容器技术,没有解决各平台软件交付标准不统一的问题,如不同的软件交付工具、应用运行规范不统一、环境依赖复杂等带来的配置开销。这些问题使容器技术的推广依然比较有限,直到 Docker 的出现。

4、Docker 时代

早期 Docker 是基于 LXC 开发,因此 Docker 容器也有着和 LXC 相似的特性,仅需要较少资源便可以启动。但不同于 LXC,Docker除了容器运行,还是一个打包、分发和运行应用程序的平台。Docker 允许将应用和其依赖的运行环境打包在一起,打包好的 “集装箱“(镜像)能够被分发到任何节点上执行,无需再进行配置环境的部署。这样使得 Docker 解决了开发和部署应用时环境配置的问题,规范化了应用交付和部署,降低了部署测试的复杂度以及开发运维的耦合度,极大提升了容器移植的便利性,便于构建自动化的部署交付流程。

Docker 和虚拟机都是资源虚拟化发展的产物,但二者在架构上又有区别:

  • 虚拟机通过 Hypervisor 虚拟化主机硬件资源,然后构建客户机操作系统,由宿主机的管理程序管理;
  • Docker 直接运行于主机内核,应用在主操作系统的用户空间上执行独立任务,不需要从操作系统开始构建环境,赋予了应用从交付到部署再到运维的独立性。

img

虚拟机的启动时间可能是分钟级的,而 Docker 容器创建是秒级别。对于硬盘的使用 Docker 一般为 MB 级别,远小于包含操作系统的虚拟机 GB 级磁盘使用量。对于操作系统来说,能支持运行的 Docker 容器数量远多于虚拟机。

Docker 容器技术在快速部署、环境标准化、隔离性方面的优势得到了开发人员普遍认可,但是如果以一个完整 PaaS 平台为标准来衡量这些还不够。首先,Docker 提供了名为 “容器” 的隔离环境,但是面对多容器间有拓扑有关联的场景,Docker还难以应对;其次,虽然容器解决了应用交付规范问题,但难以实现完全应用托管;另外,随着基础设施规模的扩大,开发中心必将分布式化,调度问题就需要解决。

2014 年 7 月 Docker 宣布收购单机容器编排软件 Fig(后来命名为 Docker Compose),并在同年 12 月推出了自己的容器集群编排项目 Docker Swarm。Docker Swarm 成功打造了两方面能力:

  1. 多容器编排能力,支持通过 YAML 文件声明多容器应用,并定义容器之间的关系;
  2. 分布式调度能力,允许跨集群节点调度容器。

Docker Compose 和 Dockers Swarm 可以基本满足开发人员对于 PaaS 平台的需求,对于Docker向平台化发展的规划具有基石一般的意义。至此,Docker未来的发展似乎很乐观,但是随着Google加入,容器市场的局面发生了重大改变。

5、Kubernetes

2014 年 Google 开源了名为 Kubernetes(简称K8S)的项目,它是由 Google 内部 Borg 项目而开源出来的容器集群管理系统。Kubernetes 继承了 Google 丰富的大规模集群运维的经验和基因,能够提供复杂的、大规模的容器编排管理服务。2015 年 Google 发布了 Kubernetes 第一个商业版本,代表 Kubernetes 进军生产级容器规模管理,也意味着开始与 Docker 竞争 PaaS 平台的未来版图。

img

Kubernetes 集群由两类节点构成:Master Node 和 Worker Node。Kubernetes 采用声明式的设计,任何操作指令都通过声明式 API 与 Master 通信。Master Node 可响应 API 声明,进行集群管理和容器调度。容器则运行在 Worker Node,Worker 负责响应 Master 指令,执行容器启停等维护操作。

除了紧密的容器关系,一个面向生产的编排系统必然应当支持更多的容器关系,所以 Kubernetes 还提供了 Deployment 无状态多副本关系、StatefulSet 有状态多副本关系、Job 一次性长任务等许多对象以满足多样的编排需求。这些对象的基础调度单元还是 Pod,由控制器 Controller 控制 Pod 对象的状态来实现声明的编排关系。

Kubernetes 使开发人员和工程师拥有了快速处理大型项目所需的管理工具和基础架构。从负载测试或创建过渡环境,到将业务和在线应用程序移至生产环境,Kubernetes 集群都可以对其进行管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB-控制系统模型之间的转换

系统的线性时不变&#xff08;LTI&#xff09;模型有传递函数&#xff08;tf&#xff09;模型、零极点增益&#xff08;zpk)模型和状态空间(ss&#xff09;模型,它们之间可以相互转换。模型之间的转换函数可以分为以下两类。第一类是把其他类型的模型转换为函数表示的模型自身&…

PHP多进程(一)

多进程的作用是一个程序启动多个进程。 一个程序启动起来本应该是一个进程&#xff0c;但它可作为父进程启动多个子进程来一起操作 形成并发操作 pcntl是php官方的多进程扩展,只能在linux环境使用 以下所有操作请在Linux环境下操作: 先认识两个函数,下面是官方文档地址: …

铜缆测试——近端和远端串扰(NEXT和FNEXT)

如果您非常熟悉铜缆测试&#xff0c;那么很可能听说过串扰——一对或一个通道上传输的信号对另外一对或一个通道产生不良影响的现象。(杂讯) 串扰会对具体的一对导线或整根电缆形成干扰&#xff0c;导致误码或数据无法传输。例如&#xff0c;您是否曾经在电话中听到有其他人说话…

马蹄集 数组最大公约数

给定一个由N个正整数组成的数组&#xff0c;求所有数组元素的最大公约数。 格式 输入格式&#xff1a;第一行输入数组长度N,第二行输入数组元素&#xff0c;整型 空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h> using namespace std;int gcd(int a…

(十八)Java的时间与日期(2)

目录 前言: 一、JDK8新增日期类 二、LocalDate&#xff0c;LocalTime,LocalDateTime 三、Instant时间戳 四、DateTimeFormatter类 五、Duration/Period类 六、ChronoUnit类 前言: JDK 8中增加了一套全新的日期时间API&#xff0c;这套API设计合理&#xff0c;是线程安全的。新的…

ctfshow学习记录-web入门(sql注入191-200)

目录web191web192web193web194web195web196web197web198web199web200九某人来更新啦&#xff1a;2023年第一篇wp新鲜出炉&#xff5e; web191 解答&#xff1a;增加了过滤 过滤了ascii&#xff0c;可以用ord方法代替。&#xff08;这里手册中也有告知~&#xff09; web190的pa…

【数据结构与算法】Trie

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

集合引用类型 下

目录 Map Map.set() Map.get() Map.delete() Map.has() Map.values() Map.entries() Map.clear() 选择Object 还是Map 数据转换 转为数组 转为 JSON 对象转为 Map 数组转为 Map 转为Object WeakMap 基本API 弱键 不可迭代 Set 创建Set实例 Set实例转数组 si…

STM32-启动文件详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转FreeRTOS &#x1f4ac;推荐…

python基础篇之数字类型(下)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

在vue2使用百度脑图的kityminder-core进行二次开发思维导图,在源码中添加新的命令

需求说明&#xff1a;最近在搞kityminder-core的思维导图&#xff0c;需要增加一个给节点添加文件的功能&#xff0c;一直在研究源码&#xff0c;发现都是通过执行命令的方式实现的。一直卡在新增命令的步骤&#xff0c;搞了好多天了今天找到了如何在源码里新增命令&#xff0c…

leetcode 1807. 替换字符串中的括号内容【python3双指针+哈希表】实现过程分析以及思路整理

题目 给你一个字符串s&#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个非空的键。 比方说&#xff0c;字符串"(name)is(age)yearsold"中&#xff0c;有两个括号对&#xff0c;分别包含键"name"和"age"。 你知道许多键对应的值&…

android实现侧边栏:解决header控件无法操作和底部menuitem点击无效的问题

1&#xff1a;目录结构&#xff1a;&#xff08;源码和总结都放在b站&#xff0c;链接在底部&#xff09; 2&#xff1a;实现的大概逻辑&#xff1a; 使用drawerlayout抽屉布局实现&#xff0c;并使用navigationview加载头部和底部 3&#xff1a;核心问题一&#xff1a;header…

用Python来创建7种不同的文件格式

用Python来创建7种不同的文件格式一、用Python来创建7种不同的文件格式1.1、文本文件1.2、CSV文件1.3、Excel文件1.4、压缩文件1.5、XML文件1.6、JSON文件1.7、PDF文件一、用Python来创建7种不同的文件格式 1.1、文本文件 写入 file_name "my_text_file.txt"# 将…

微信小程序——WXML模板语法-条件渲染,列表渲染

一.条件渲染1.wx:if在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码块&#xff1a;也可以用wx:elif和wx:else来添加else判断&#xff1a;实例如下&#xff1a;1.在js文件中定义一个typedata:{type:1 },此时虚拟页面上显示的就是&#xff1a…

二十四、Kubernetes中Deployment(Deploy)控制器详解

1、概述 在kubernetes中&#xff0c;有很多类型的pod控制器&#xff0c;每种都有自己的适合的场景&#xff0c;常见的有下面这些&#xff1a; ReplicationController&#xff1a;比较原始的pod控制器&#xff0c;已经被废弃&#xff0c;由ReplicaSet替代 ReplicaSet&#xff…

kafka/bin/kafka-run-class.sh: line 342: exec: java: not found

本来jps看了下&#xff0c;kafka和zookeeper都起来了&#xff0c;手痒&#xff0c;非要换宝塔的进程守护管理器&#xff0c;选目录为/home/kafka&#xff0c;命令为/home/kafka/bin/zookeeper-server-start.sh /home/kafka/config/zookeeper.properties 就在日志里看到 kafk…

马蹄集 整除的总数

整除的总数 难度&#xff1a;白银 时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入正整数N和M,其中N<M。求区间[N,M]中可被K整除的总数。 格式 输入格式&#xff1a;输入正整数N,M和K,空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h&g…

RabbitMQ(二)使用Docker安装

目录1. 拉取 RabbitMQ 镜像2.启动 RabbitMQ 容器3.查看 RabbitMQ 是否启动官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 这篇文章为了方便初学者入门&#xff0c;在 linux 环境下用 docker 直接安装 RabbitMQ&…

【JavaSE】String相关知识

String \ StringBuilder \ StringBufferString的值是不可变的&#xff0c;使用“”或者“”的方法尝试改变String的值并不是在原本的基础上修改&#xff0c;而是赋值给了新的字符串常量引用StringBuffer是线程安全的&#xff0c;使用的是无脑加synchronized的方法这三者的运行速…