【docker概念和实践 1】 基本概念和组成原理

news2024/12/29 17:16:28

一、说明

        初学Docker就一个字:乱!这是因为Docker是一个庞大体系,初学时不了解全貌,处于“盲人摸象”状态,因不能通晓要领,学了一点,过后就忘了。而了解Docker全貌并非易事,官方文档也比较乱,找不到初学的切入点。本文试图回顾(或叫反思)Docker这种技术,从宏观上俯视Docker,期望对初学者起到“导游”的意义。然而“说一漏万”,存在诸多说不太透的地方,不期望大家谅解,而是期望初学者们诚心诚意地付出时间和努力,勤学勤练,最后彻底掌握。

二、Docker的目的

        为什么要有Docker,不学Docker能死吗?

        要回答此类问题,首先应从Docker产生的时代背景,以及它对开发的影响说起,结论读者自己总结。

2.1 时势造Docker

        Docker没有出现之前,开发领域教科书是《软件工程》所提出的:结构化、模块化、对象化。然而,随着互联网的成果推进,出现如下事实:1 要求跨平台  2 模块体系越来越大 3 交叉技术模块相互整合不易 4 软件集成有困难。

        出现以上现象的原因,一方面因为网上功能爆炸式增长,云计算、大数据、人工智能的出现,使得开发不再是单一的,因而掌握复杂的开发和部署需要“全才”,而“全才”非常稀缺。因此,不跳出传统框架,已经无能为力。而Docker就是另辟新途径的划时代新发明。

2.2 Docker的概念源头

        Docker的出现,不是突发的。而是通过已经存在的技术,逐步“催化”产生,它继承了现有诸多的软件成果,具体内容如下。

2.2.1 对于跨平台的构思

        Docker以虚拟机的概念为基础的,每个独立最小单元称之为容器,容器内部包含一个独立小型Linix操作系统(这里注意Docker是基于Linux的,不是windows、也不是iso)。

2.2.2 对于docker模块之间的信息交换

        是基于网络的(注意不是进程间通信,而是网络主机与主机的通信,即便在一台电脑上也是这样).

2.2.3 人机交互

        CS结构,这一点类似于mysql数据库,有一个client、有一个server,docker体系中存在这样的关系。

2.2.4 云服务端

        docker不是孤立的本地小系统、而是社会化的大系统,对于镜像的管理是在云端实现,这和github类似,具有一定的开源共享性。

2.3 Docker对开发的影响

        对于项目开发,团队的专业分工依然存在,Docker无法避免,但是,Docker可以使得庞大松散的产品从一个环竟迁移到另一个环境变得容易。

        传统Linix开发存在问题是经常性的安装版本,使用docker后,通过社会化共享,使得网上拉取镜像代替了安装,不仅节约了时间,而且结构上更加可靠。

        大的复杂系统,传统上是把小系统通过集成构造出大系统,而有了Docker概念,可以以Docker为颗粒,设计大系统,免除了集成的麻烦。

        开发团队与运维团队存在沟通不力的问题,传统开发是开发人员“进驻”运维团队,有了Docker使得运维更加方便,“进驻”的力度大大降低。

三、docker一般概念

3.1 知识点

  • docker体系结构:Docker内部运作机理是啥?
  • 开发者活动:开发者如何参与Docker活动?
  • 更加宏观地看待Docker整体活动:开发者如何应用docker的便利,去开发项目?
  • docker存储和复用:docker的社会管理,hub和阿里云等
  • 文件复用:Docker如何搬家?备份和存储?

3.2 docker体系结构:Docker内部运作机理是啥?

        因为初学者接触Docker,不能回避安装这个过程。我们这里就从Docker的安装语句上说起,让大家立刻进入某种思考状态。

安装语句:

$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

以上安装语句直观地告诉我们,Docker有很多部件构成,他们是:

  • docker-ce  引擎
  • docker-ce-cli 客户端
  • containerd.io 输入输出接口
  • docker-compose-plugin 组成插件

        一个docker体系,在安装完成后,将有如下图所示的结构:

对上图的解释:

1 CS结构实现指令输入输出

这是实现人机交互的部分,也是CS构架,其中包括:

  • Docker Client客户端终端
  • Docker Server伺服务器

2  Engine引擎部分

这部分有两部分功能 

  • 指令解析成job
  • 分配job任务

 

示例指令1:

 Docker pull Ubuntu

其中 “pull”就是一个job,其中功能, 1)如果本地有个ubuntu Image,那么提示存在 ,否则 2)从网上下载一个存在本地。因此有如下过程:

其中(4)是从本地Image仓库查找,如果有,就拉取之并存在当前环境中。如果本地仓库无,转入(7)步,即从网上云端拉取。

示例指令2:

docker create  --name myrunoob  nginx:latest  

流程分解:

1)分析指令后,分解出Create指令

2)如果当前环境有Ngix镜像,就沿着(5)执行构建一个Container。

3)如果当前环境没有Ngix镜像,(6)从云仓库拉取ngix镜像,沿着(5)执行构建一个Container。

示例指令3

启动一个容器,通过IO口,将本地容器启动起来。可以看出,容器已经ready,通过程序的driver库将容器进程启动起来。(注意:容器不是宿主机进程,无法在宿主机启动,必须通过Docker引擎干预)。

3.3  Docker的四个基本概念

        Docker存在是个重要概念: 镜像、容器、引擎、仓库;这里不讲它们之间的关系,但是务必搞清这四个概念。

3.4  Docker和虚拟机的区别

docker和虚拟机存在重要区别,主要表现两个方面

1)从体量上比较

  • 虚拟机内存在完整的,尽善尽美的操作系统,因此十分庞大,一般几个G的存储量,安装时间有几十分钟。
  • docker是简体版操作系统,是将操作系统裁剪到刚好支持内部程序,十分小,一般有几十个M的存储量。

2)从设计思路上

  • 虚拟机是在做“加法”的,该有的尽有。
  • docker是做减法的,能不要的就尽量不要。

3.5  容器和进程的区别

容器和进程有类似,但也有区别,分别如下:

1)集成的观点看两者有共同性

  • 进程与进程可以构成更大的系统,但是这种集成规模不能过大,比如上万个进程可能就存在无法管理的问题。
  • Docker的多个容器合成更大系统和多进程系统有类似之处,但是每个容器中可以包含一个系统,比如Ubuntu容器,内涵整个操作系统。tomcat容器,内部包含整个tomcat的功能,这种大规模的集成是多进程系统所无法完成的。

2)从功能上看

  • 从功能上看,进程与进程构成的系统功能比较单一、不够强大。
  • docker的容器之间集成的系统规模庞大,功能更强大,因为每个容器内部嵌入一个简版操作系统,可以将网络功能、服务器、数据库、互联网、大数据、人工智能等各种大系统集成起来,因而功能之强大是前所未有的。

四、docker集群的观念

4.1.  理解集群(swarm)

        swarm是一组运行着Docker的机器,它们一起加入到一个集群。swarm中的机器既可以是物理机,也可以是虚拟机。

        在加入到一个swarm后,每台机器被称为一个节点。以前,我们执行docker命令由对应的机器去执行,而现在多台机器组成swarm后,Docker命令由swarm manager去执行,swarm manager也管理Node内容器得增添、删除等。

        能够集群得工具很多,这里介绍两个:docker swarmkubernetes。

4.2 docker swarm 集群工具

        Docker Swarm是针对 Docker 容器技术创建的集群工具。最关键的是 Dcoker Swarm 对外提供的是完全标准的 Docker API,因此任何使用 Docker API 与 Docker 进行通讯的工具(Docker ClI, Docker Compose, Dokku, Krane)都可以完全无缝地和 Docker Swarm协同工作。这一点对 Docker Swarm 来说既是一个优点,也是一个缺点。

  • swarm就是集群,是Docker集群,它是一组运行着Docker的机器组成的
  • 组成Docker集群以后,集群中的每台机器被称之为一个node,其中有一台机器是这个集群的管理者,称之为manager,其余的称之为worker
  • 在集群中,你的命令都是由manager去执行的,这与你当前在那台机器上输入的命令无关
  • 与集群模式相对的是单机模式,之前我们一直是以单机模式使用Docker的
  • 类比Redis机器的话,manager就相当于master,worker相当于slave

4.3 kubernetes容器集群管理系统

        k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。而Docker是一个开源的应用容器引擎,是一种容器化技术。

        docker是容器层面的,kubernetes是容器编排和组织管理层面的。

        Kubernetes 是基于 google 自身多年使用 linux 容器的经验创建出来的,所以可以说它是 Google自身多年操作经验的一个复制,只是 google 把这些操作经验应用到了 Docker 上。 使用Kubernetes 来管理容器在多个方面都将带来很大的好处,而其中最重要的就是 Google 把他们多年使用容器的经验带入了这个工具。如果你是从 Docker1.0 (或者更早之前的版本)开始使用Kubernetes,你会发现使用 Kubernetes 来管理 docker 容器是非常愉悦的体验。

        值得注意的是,K8S虽然支持Docker,但不是为Docker量身定做的,而是支持所有的其它容器的集群。

五、小结

        本篇叙述Docker概要,动笔较为仓促,但作为一种框架先推放出去,后期我将在本文基础上,逐步改进其粗糙面,添加更多细节,使叙述更完善,内容更充实、更具备可阅读性。 

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

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

相关文章

前端学习记录-Javascript

pink JS基础语法JavaScript核心教程阮一峰JS基础 JS基础语法 初识JS JS三种书写位置:行内、内嵌、引入式。单行注释 ctrl/ 多行注释 shift alt a输入输出语句 声明变量 var age;变量命名规范:字母、数字、下划线、美元符号组成,区分大小写…

质量体系搭建

测试团队的发展历程 初期阶段 特点:提供“保姆式”服务,以发现BUG为主要任务。 工作主要:以功能测试、兼容行测试为主的手工测试,每天进行大量的、重复性的工作,即便如此依然会有遗漏。刚起步的测试团队基本处于这个阶…

LeetCode分类刷题----哈希表篇

哈希表哈希表1.有效的字母异位词242.有效的字母异位词383.赎金信49.字母异位词分组438.找到字符串中所有字母异位词2.两个数组的交集349.两个数组的交集350.两个数组的交集||3.快乐数202202.快乐数4.两数之和1.两数之和5.四数相加454.四数相加||6.三数之和15.三数之和7.四数之和…

ARM 实时时钟 RTC

一、何为实时时钟 (1) real time clock,真实时间,就是所谓的xx年x月x日x时x分x秒星期x. (2) RTC是 SoC 中一个内部外设,RTC 有自己独立的晶振提供 RTC 时钟源(32.768KHz),内部有一些寄存器用来记录时间&am…

微信小程序登陆,后端接口实现 - springboot

登录流程 1、通过调用wx.login获取登录凭证(code) uni-app通过调用uni.login 2、前端将code提交给服务器,springboot访问 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息。 3、完成登录操作&#xff0…

数学计算-C语言实现

任务描述 计算如下公式的值: 其中π=3.1415926 本关知识 C语言常用数学函数及其用法 在使用C语言数学函数时候,应该在该源文件中使用以下命令行包含库文件: #include <math.h> 或 #include "math.h" 本题中用到的C语言数学函数如下: abs函数: 求整型…

Pytorch模型自定义数据集训练流程

文章目录Pytorch模型自定义数据集训练流程1、任务描述2、导入各种需要用到的包3、分割数据集4、将数据转成pytorch标准的DataLoader输入格式5、导入预训练模型&#xff0c;并修改分类层6、开始模型训练7、利用训好的模型做预测Pytorch模型自定义数据集训练流程 我们以kaggle竞…

交互与前端20 APIFunc.DataBase监控

说明 APIFunc.DataBase的第一版有一个监控一直在做agg,造成数据库的无谓消耗,所以一定得修补。在修补的同时,做了一些主要的修改: 1 【自增ID】给Mongo的In和Out增加了数据的自动编号和随机数生成。2 【使用缓存】通过Redis缓存,极大的的减轻了Mongo(主库)的负担这样,使得…

Kruskal重构树学习笔记(C++)

Kruskal重构树学习笔记 提示&#xff1a; 学习Kruskal重构树之前建议先了解一下Kruskal算法&#xff0c;虽然不了解这个影响不会很大 但一定要了解一下并查集的算法 接下来如果想要应用Kruskal重构树&#xff0c;一定要了解一下LCA算法 什么是Kruskal重构树 这里先简单说…

exec函数族详解

文章目录exec介绍exec族execl函数execlp函数execv函数exec介绍 通过命令查看帮助&#xff1a;man 3 exec exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。…

基于多线程版本的定时器

定时器 1)咱们前面学习过的阻塞队列&#xff0c;相比于普通的队列线程安全&#xff0c;相比于普通的队列起到一个更好的阻塞效果 2)虽然使用阻塞队列&#xff0c;可以达到销峰填谷这样的一个效果&#xff0c;但是峰值中有大量的数据涌入到队列中&#xff0c;如果后续的服务器消…

教程:Flutter 和 Rust混合编程,使用flutter_rust_bridge自动生成ffi代码

实践环境&#xff1a;Arch Linuxflutter_rust_bridge官方文档Flutter环境配置教程 | Rust环境配置教程记录使用flutter_rust_bridge遇到的一些坑。假设已经我们配置了Fluuter与Rust环境现在直接使用flutter_rust_bridge模板创建自己的项目运行&#xff1a;git clone https://gi…

W13Scan 扫描器挖掘漏洞实践

一、背景 这段时间总想捣鼓扫描器&#xff0c;发现自己的一些想法很多前辈已经做了东西&#xff0c;让我有点小沮丧同时也有点小兴奋&#xff0c;说明思路是对的&#xff0c;我准备站在巨人的肩膀去二次开发&#xff0c;加入一些自己的想法&#xff0c;从freebuf中看到W13Scan…

进程调度模块

目录 1.进程介绍 2.进程调度 2.1.进程状态 2.2.进程调度函数 ---schedule 2.3.进程切换函数 ---switch_to&#xff08;&#xff09; 1.进程介绍 在进程模块里面&#xff0c;我们知道了进程就是一个task_struct的结构体&#xff0c;里面含有进程的各种信息。进程存放在进程…

AppScan被动手动探索扫描

系列文章 AppScan介绍和安装 AppScan 扫描web应用程序 第三节-AppScan被动手动探索扫描 被动式扫描&#xff1a;浏览器代理到AppScan&#xff0c;然后进行手工操作&#xff0c;探索产生出的流量给AppScan进行扫描。 他的优点是&#xff1a;扫描足够精准&#xff0c;覆盖率更…

注册中心和负载均衡(黑马SpringCloud笔记)

注册中心和负载均衡 目录注册中心和负载均衡一、服务远程调用1. RestTemplate2. 服务调用关系3. 远程调用的问题二、注册中心1. Eureka注册中心1.1 搭建Eureka注册中心1.2 服务注册1.3 服务拉取1.4 小结2. nacos注册中心2.1Nacos搭建2.2 服务注册2.3 服务拉取2.4 服务分级存储模…

虹科新闻 | 虹科与丹麦Eupry正式建立合作伙伴关系

近期&#xff0c;虹科与丹麦Eupry正式建立合作伙伴关系。未来&#xff0c;虹科与Eupry将共同关注最具创新性和稳定性的解决方案&#xff0c;为客户提供温度记录仪、温湿度记录仪、Mapping温度分布验证服务、以及基于云的温湿度自动监测系统。 虹科非常高兴欢迎并宣布我们的新合…

【Linux】基础:进程信号

【Linux】基础&#xff1a;进程信号 摘要&#xff1a;本文将会从生活实际出发&#xff0c;由此掌握进程信号的学习过程&#xff0c;分别为信号的产生、信号的传输、信号的保存和信号的处理&#xff0c;最后再补充学习信号后方便理解的其他概念。 文章目录【Linux】基础&#xf…

echarts柱状图值为0时不显示以及柱状图百分比展示

echarts柱状图值为0时不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id"container"><div id"main"></div></div> </template> <script>import * as echarts from echarts import * as lodash…

(JVM)浅堆深堆与内存泄露

​浅堆深堆与内存泄露 1. 浅堆&#xff08;Shallow Heap&#xff09; 浅堆是指一个对象所消耗的内存。在 32 位系统中&#xff0c;一个对象引用会占据 4 个字节&#xff0c;一个 int 类型会占据 4 个字节&#xff0c;long 型变量会占据 8 个字节&#xff0c;每个对象头需要占用…