什么是Docker?看这一篇干货文章就够了!

news2024/11/17 9:31:36

什么是Docker

  • 容器技术的起源
  • 容器技术 vs 虚拟机
  • 什么是容器
  • 什么是docker
  • 如何使用docker
  • docker是如何工作的
  • docker的底层实现
  • 总结

在这里插入图片描述

作为程序员我们应怎样理解docker?

容器技术的起源

假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。

测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。

从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。

有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?”

在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。

先科普一下,现在云计算其底层的基石就是虚拟机技术,云计算厂商买回来一堆硬件搭建好数据中心后使用虚拟机技术就可以将硬件资源进行切分了,比如可以切分出100台虚拟机,这样就可以卖给很多用户了。

你可能会想这个办法为什么不好呢?

容器技术 vs 虚拟机

我们知道和一个单纯的应用程序相比,操作系统是一个很重而且很笨的程序,简称笨重,有多笨重呢?

我们知道操作系统运行起来是需要占用很多资源的,大家对此肯定深有体会,刚装好的系统还什么都没有部署,单纯的操作系统其磁盘占用至少几十G起步,内存要几个G起步。

假设我有一台机器,16G内存,需要部署三个应用,那么使用虚拟机技术可以这样划分:
在这里插入图片描述

在这台机器上开启三个虚拟机,每个虚拟机上部署一个应用,其中VM1占用2G内存,VM2占用1G内存,VM3占用了4G内存。

我们可以看到虚拟本身就占据了总共7G内存,因此我们没有办法划分出更过虚拟机从而部署更多的应用程序,可是我们部署的是应用程序,要用的也是应用程序而不是操作系统。

如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上岂不是太香?这是问题一,主要原因在于操作系统太重了。

还有另一个问题,那就是启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟,因此操作系统还是太笨了。

那么有没有一种技术可以让我们获得虚拟机的好处又能克服这些缺点从而一举实现鱼和熊掌的兼得呢?

答案是肯定的,这就是容器技术。

什么是容器

容器一词的英文是container,其实container还有集装箱的意思,集装箱绝对是商业史上了不起的一项发明,大大降低了海洋贸易运输成本。让我们来看看集装箱的好处:

集装箱之间相互隔离
长期反复使用
快速装载和卸载
规格标准,在港口和船上都可以摆放

回到软件中的容器,其实容器和集装箱在概念上是很相似的。

现代软件开发的一大目的就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。

在这里插入图片描述

但是虚拟机技术有上述提到的各种缺点,那么容器技术又怎么样呢?

与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。

在这里插入图片描述

从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式,So cool。

那么我们该怎么使用容器呢?这就要讲到docker了。

注意,容器是一种通用技术,docker只是其中的一种实现。

什么是docker

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。

因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,程序员再也无法施展表演才华了,不会再有“在我的环境上可以运行”,真正实现“build once, run everywhere”。

此外docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。

如何使用docker

docker中有这样几个概念:

dockerfile
image
container
实际上你可以简单的把image理解为可执行程序,container就是运行起来的进程。

那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。

因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。

具体的使用方法就不再这里赘述了,大家可以参考docker的官方文档,那里有详细的讲解。

docker是如何工作的

实际上docker使用了常见的CS架构,也就是client-server模式,docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker demon,值得注意的是,docker client和docker demon可以运行在同一台机器上。

接下来我们用几个命令来讲解一下docker的工作流程:

1,docker build

当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。
在这里插入图片描述

2,docker run

有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。

在这里插入图片描述

3,docker pull

其实docker build和docker run是两个最核心的命令,会用这两个命令基本上docker就可以用起来了,剩下的就是一些补充。

那么docker pull是什么意思呢?

我们之前说过,docker中image的概念就类似于“可执行程序”,我们可以从哪里下载到别人写好的应用程序呢?很简单,那就是APP Store,即应用商店。与之类似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是肯定的,这就是Docker Hub,docker官方的“应用商店”,你可以在这里下载到别人编写好的image,这样你就不用自己编写dockerfile了。
在这里插入图片描述

docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢,就是这里的docker pull命令了。

因此,这个命令的实现也很简单,那就是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样我们就可以使用image了。

最后,让我们来看一下docker的底层实现。

docker的底层实现

docker基于Linux内核提供这样几项功能实现的:

NameSpace
我们知道Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰,这就使得每个NameSpace看上去就像一个独立的操作系统一样,但是只有NameSpace是不够。
Control groups
虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。
有了这两项技术,容器看起来就真的像是独立的操作系统了。

总结

docker是目前非常流行的技术,很多公司都在生产环境中使用,但是docker依赖的底层技术实际上很早就已经出现了,现在以docker的形式重新焕发活力,并且能很好的解决面临的问题,希望本文能对大家理解docker有所帮助,欢迎大家点赞哦~~

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

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

相关文章

ORB-SLAM3算法和代码学习——重定位Relocalization

0总述 重定位是ORB-SLAM系列保持跟踪稳定性的保障,从ORB-SLAM沿用至ORB-SLAM3。主要作用是在跟踪失败时,通过词袋向量搜索在关键帧数据库中寻找和当前帧相似的关键帧作为匹配帧,建立数据关联并计算当前帧的位姿,恢复相机的运动。…

正大国际期货:外盘短线交易九大生存准则:从亏损预期出发

一、生存是第一位 这并不是陈词滥调,投机是非常危险的活动。投机非并输赢那样简单,首要的任务是在顶峰和谷底之间的波动中生存,如果连生存都做不到,你根本就没有谈及赢的资格。 即使有了好的资金管理、正确的系统和行动的前提&a…

Ubuntu18.04下安装配置AndroidStudio软件图文教程

运行环境:操作系统为Ubuntu18.04,android-studio版本为2022.1.1.19-linux,Java版本为jdk8,安装路径/opt/android-studio/,当前用户为xqf222,sdk下载路径默认为/home/xqf222/Android/Sdk 详细步骤和指令如下: 1.安装JDK8&#xf…

VTK CT重建(一) MPR 多层面重建 四视图

除了MPR之外,在CT重建后处理中还有很多别的常用方法,包括 多层面重建(MPR)最大密度投影(MIP)最小密度投影(MinIP)表面阴影遮盖(SSD)容积漫游技术&#xff08…

go validator参数校验器自定义规则及提示(自定义异常返回提示语)

原文连接:https://segmentfault.com/a/1190000040445612 笔者针对参数为指针的情况做了一点小优化 这里我们用validator用来做参数校验,gin默认的github.com/go-playground/validator,可以直接使用 除此之外还有一些其他的工具也挺好用的&am…

Linux基础指令

本文已收录至《Linux知识与编程》专栏!作者:ARMCSKGT演示环境:CentOS 7 目录 前言 正文 查看当前用户whoami 查看当前目录路径pwd 清理屏幕clear 查看目录下文件指令ls 进入目录指令cd 以树状结构显示目录文件tree 创建普通文件指令t…

Leetcode.1669 合并两个链表

题目链接 Leetcode.1669 合并两个链表 Rating : 1428 题目描述 给你两个链表 list1和 list2,它们包含的元素分别为 n个和 m个。 请你将 list1中下标从 a到 b的全部节点都删除,并将list2接在被删除节点的位置。 示例 1: 输入:li…

rtsp实时流通过rtmp推送到服务端

ffmpeg可以实现这个功能。ffmpeg支持rtsp协议,也支持rtmp。在这个案例中rtsp是输入, rtmp是输出,ffmpeg实现了转码的功能。下面可出一个整体思路流程图。 如图1所示:在获取都rtsp流以后,解复用(demux&…

检测之VOC转YOLO

文章目录检测所用数据有几种文件格式,我们对于检测,将使用VOC格式做为基础,与其它格式的的互转实现部分如下:检测系列相关文章参考如下链接: VOC数据的结构介绍及自定义生成,用labelimg自已标注VOC标准数据…

Notepad++作死,国产文本编辑器Notepad--发布

作死的Notepad Notepad 和 Notepad 都是基于 Windows 的文本编辑器,通常用于编写和编辑纯文本文件。 这两个应用程序都是简单的轻量级程序,提供基本的文本编辑功能。 Notepad是一口君经常使用的一款文本编辑软件,用了大概10年了。 然而Not…

配置并行(RH294)

当Ansible处理playbook的时候会顺序运行每个play确定play的主机列表之后Ansible将按顺序运行每个任务一般来说,所有主机必须在任何主机在play中启动下一个任务之前成功完成任务理论上,Ansible可以同时连接到play中的所有主机来执行每项任务Ansible所进行…

​力扣解法汇总1669. 合并两个链表

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。…

解决Vue启动失败报错:Module not found: Error: Can‘t resolve ‘less-loader‘

问题描述 今天想在网上找一个好看的登录页面,把别人的代码引入进来之后,发现项目编译不了,并且报错了: Module not found: Error: Can’t resolve ‘less-loader’ 分析问题 从错误的日志就可以看出来,是缺少了less-…

Linux: 关于 SIGCHLD 的更多细节

僵尸进程 何为僵尸进程? 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程成为僵尸进程的因素 子进程 先…

AOP的一点浅薄理解

AOP思想应该怎么去理解! Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 Joint point(连接点):表示在程序中明确定义的点…

C语言学习笔记-变量

我们知道每一个程序的运行都需要内存,那么C语言的变量的定义是什么含义呢? 假如我花了200元买了一块4G内存条,然后我定义了一个int a ;就意味着从这4G的内存上要拿走4个字节,又定义了一个int b;那么b同样也要从4G的内存…

【OpenGL学习】OpenGL实现 基于Phong模型的基础光照

基于Phong模型的基础光照 在本节中,我们将利用 Phong 光照模型来完成一个简单的光照场景的渲染。 一、Phong 光照模型 Phong光照模型是20世纪70年代被提出的一种渲染逼真图像的方法,模型的提出者是越南出生的计算机图形学研究员Bui Tuong Phong&#…

JavaScript中的String和自定义对象~

String对象: 它是 JavaScript 的一种基本的数据类型 String 对象的 length 属性声明了该字符串中的字符数,String 类定义了大量操作字符串的方法,例如从字符串中提取字符或子串,或者检索字符或子串 需要注意的是,Ja…

单行文本域,多行文本域隐藏问题

多行文本域隐藏问题 overflow: hidden; 首先是溢出隐藏&#xff0c;不可或缺 display: -webkit-box; 以弹性盒模型显示 -webkit-box-orient: vertical; 盒模型元素的排列方式 -webkit-line-clamp: 3; 显示行数 <style>.postnameStyle{font-size: 30rpx;font-weight: …

【科研】ET-BERT资料库梳理

作者原repo链接 https://github.com/linwhitehat/ET-BERT 0.资料总库 分为数据模型语料库 1.数据集 包含fine-tuning数据集&#xff08;cstnet-tls 1.3&#xff09;与公开数据集&#xff08;USTC-TFC、VPN-app、VPN-service的数据包级和流级&#xff09;目录链接 1.1 微调…