Docker入门扫盲【进来领取脑图】

大鱼仙人

共 4804字,需浏览 10分钟

 ·

2021-09-22 02:09

开篇

眼光不错,点进来就是赚到,这篇文章绝对让你有所收获,让你对Docker的理解更上一层楼

Docker这项技术其实大家或多或少都听过的,或者是在你以往投简历的时候,划水刷博客、刷论坛的时候,肯定也见到过这一门技术,你要是真的没听过也没见过,去问百度,问谷歌,问你们公司的运维,这个虽然可以说是属于运维工程师的必备技能之一,但是作为一名专业的程序员,也是需要简单的去了解这项技术的,也是面试利器之一

这个念头,360行,行行都内卷,你想啊,你要是把我这篇文章看完了,了解了这项技术,那岂不是可以在面试的时候吹牛逼了

然后呢,继续跟着我后续的文章(疯狂暗示关注...),去学习了这个技术,你和同内卷者一起去面试,你会这个技术,别人不会

那offer岂不是到手了??别人看你的眼神会...


接下来我们就来一起来学习这个Docker吧

你学习一个新技术一般是用什么样的思路去学习呢?我学习的前期的思路肯定是需要先知其然,再只求所以然,大致归类一下就是

1、Docker是什么?干啥的?

2、Docker是如何解决痛点的,如何解决问题的?

3、Docker的架构、内部原理和实现方式?

4、Docker的简单使用?

我们先来看一下维基百科中的解释

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。


Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容


再来看一下百度百科的解释


由百度词条的定义,我们可以捕捉到几个关键词,应用容器虚拟化沙箱。

简单的说,容器就是用于存储的一个东西;虚拟化,就是将一台计算机虚拟成多台逻辑计算机;沙箱,是一个独立的工作环境,在内部的任何操作不会影响到外部。总结起来,docker能够生成一个个空间,每个空间内部装载了一些应用及其依赖包,空间之间互不影响,这些空间能够将计算机切分成若干个逻辑(虚拟)计算机。

打个比方,docker类似集装箱,各式各样的货物,经过集装箱的标准化进行托管,集装箱与集装箱之间没有影响。本来docker公司就是设想,交付运行如同海运一般,以OS(操作系统)为货轮,进行集装箱运输。

怎么样,听起来这个说法会不会很熟悉?是不是觉得和虚拟机很像?确实,docker和虚拟机的基本思想是一致的,都是通过打包,隔离等手段,将物理计算机分成若干个虚拟计算机,彼此之间相互影响。但是两者还是有区别的,了解两者的区别,有助于我们理解docker技术的优势。


Docker的来历

Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

在工作中一般会遇到最少四个不一样的环境,我们写代码的环境叫做开发环境,然后我们自测没问题了,发到测试环境去测试,测试环境一般会包含最少三个以上,来应对产品日益增加的需求

多个测试环境也就可以支持多个需求的并行进展,而且一般还有一个预上线环境(预发环境),这个属于最接近于线上环境的环境了,包括数据也尽可能的去接近于线上环境的数据,预上线环境就是无限接近于线上环境的环境了

对外使用的叫做线上环境(生产环境),这个环境是用于真实用户的,我们作为一个软件的普通使用者,操作的就是这个软件的生产环境

一般开发人员开发完代码之后,都会自测相应的接口和代码,虽然我们测好了在开发环境,但是也避免不了发到测试环境会出现各种各样的问题,因为各个环境之间也是有差异的,数据库版本、JDK版本、各种配置文件的不同...

所以就有个笑话《千万不要跟程序员说,你的代码有bug》:

他的第一反应是你的环境有问题,第二就是你是傻逼不会用吧。你要跟他这么说:“这个程序运行的怎么运行的跟预期不一样,是我操作有问题吗?”。这货就会第一反应“我擦,这是不是出bug了?”

总之,Docker主要就是为了让程序员解决在协作编码时"在我的机器上可正常工作”的苦恼

Docker

接下来我们解释下Docker,要想解释清楚Docker,就需要清楚容器Container的概念,要解释容器,我们就需要先从操作系统说起了,首先我们知道操作系统管理的是软件和硬件资源

硬件资源包含:内存、存储设备、CPU等

软件资源包含:各类软件的运行、进程的调度、线程的分配之类的工作

这里我们要做到的是为一个软件提供一个环境环境,这个运行环境通常是由操作系统内核提供,另一部分运行库提供;随着硬件的性能提升,以及软件种类的丰富,有两种情况变得很常见:

硬件性能过剩:很多计算机的硬件配置,即使不能完全满足峰值性能的要求,也往往会有大量时间处于硬件资源闲置的状态。例如一般家用电脑,已经是四核、六核的配置了,除了3A游戏、视频制作、3D渲染、高性能计算等特殊应用外,通常有90%以上时间CPU是闲置的。

软件冲突:因为业务需要,两个或者多个软件之间冲突,或者需要同一个软件的不同版本。例如早几年做web前端的,要测试网页在不同版本的IE上是否能正常显示,然而Windows只能装一个版本的IE。

为了解决软件冲突,只能配置多个电脑,或者一个电脑装多个操作系统,通过重启来解决,显然这样是不友好的

虚拟机和Docker

于是乎,在硬件性能过剩的情况下,硬件虚拟机这一概念就被提出来了,所谓的硬件虚拟化,就是通过某个特殊的软件,仿真出一台或者多台计算机的各种硬件,用户可以在一台电脑,通过虚拟机即可按照、运行操作系统(一般叫来宾操作系统,Guest OS)

虚拟机的一个缺点就是占用资源过多,比如一个Windows系统开机不运行任何软件需要两三个G,一个没有图形化的Linux也需要占用几百兆的内存,而且为了应用系统运行的性能,往往还要给每台虚拟机留出更多的内存容量

能不能所有的应用使用同一个的操作系统减少硬件资源的浪费,但是又能避免包括运行库运行库在内的软件冲突呢?

图中,每一个App和Lib的组合,就是一个容器。也就是Docker图标里面的一个集装箱。

和虚拟机相比,容器有以下优点:

  • 迅速启动:没有虚拟机硬件的初始化,没有Guest OS的启动过程,可以节约很多启动时间,这就是容器的“开箱即用”。

  • 占用资源少:内存占用、存储空间占用都小的多。

  • 相同配置的服务器,如果运行虚拟机只能运行十多台的,通常可以运行上百个容器毫无压力。

当然,和虚拟机相比,因为共用内核,只靠cgroup隔离,应用之间的隔离是不如虚拟机彻底的,如果某个应用运行时导致内核崩溃,所有的容器都会崩溃。

而虚拟机内的应用崩溃,理论上是不会影响其它虚拟机以及上面运行的应用的,除非是硬件或者Hypervisor有Bug

Docker镜像

Docker把App和Lib的文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:

多个App可以共用相同的底层镜像(初始的操作系统镜像)

App运行时的IO操作和镜像文件隔离

通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个App镜像可以同时用来运行无数个不同业务的容器

上图是基于一个Alpine Linux的镜像,分别建立了Nginx和MySQL的镜像,并且挂载不同的配置/数据同时运行3个网站应用3个数据库应用的示意图。

最后的结果就是,绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用。

用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会需要消耗更多的硬件资源,不会明显降低性能

Docker的架构

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

镜像image:Docker镜像(Image)就是一个只读的模板

例如:一个镜像可以包含一个完整的操作系统环境。镜像可以用来创建相应的Docker容器,一个镜像也可以创建多个Docker容器。也可以直接找相应的好的镜像去下载使用即可

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:


右边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层,这些层是Docker内部的实现细节,

仓库repository:仓库(Repository)是集中存放镜像文件的场所

有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag),仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库,当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了

Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务

容器container:Docker利用容器(Container)来运行应用

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序


容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

三者之间的关系:  


知识框图

好了,以上就是全部内容了,我是小鱼仙,你们的学习成长小伙伴                        

我希望有一天能够靠写字养活自己,现在还在磨练,这个时间可能会有很多年,感谢你们做我最初的读者和传播者。请大家相信,只要给我一份爱,我终究会还你们一页情的。

再次感谢大家能够读到这里,我后面会持续的更新技术文章以及一些记录生活的灵魂文章,如果觉得不错的,觉得大鱼同学有点东西的话,求点赞、关注、分享三连

哦,对了!后续的更新文章我都会及时放到这里,欢迎大家点击观看,都是干货文章啊,建议收藏,以后随时翻阅查看

https://github.com/DayuMM2021/Java



浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报