【Docker】Docker概述、理解docker的集装箱、标准化、隔离的思想、 docker出现解决了什么问题
整理一下 慕课网 第一个docker化的java应用 Docker环境下的前后端分离项目部署与运维 课程时所做的笔记
Docker概述
docker - https://www.docker.com/
简介:Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。
Docker特别的火,技术大会那都少不了云计算,少不了docker,docker解决大部分企业的痛点,快速的持续集成,服务弹性伸缩,部署简单,解放了运维,为企业节省了机器资源,非常多的公司大规模使用docker。
docker成为了IT人员的必备技能,做开发,做测试,做运维,绝大部都会接触到Docker,走进docker的世界。
问:docker到底是干什么的呢?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
还是不懂docker是什么为什么怎么用。。。一个容器?快速部署?,打包应用及依赖到一个可移植的容器,实现虚拟化?docker是一个用来装应用的容器,容器搞来搞去?
Docker历史
- 2010 dotCloud PAAS
- 2013 docker开源
- 2014.6 Docker 1.0
- 2014.7 获得C轮融资 $4000W
- 2015.4 获得D轮融资 $9500W
- 不断发展中Docker
2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombinator的支持,后来微软谷歌亚马逊这样的大厂商也纷纷加入PAAS平台,竞争十分激烈,dotCloud举步维艰.幸运的事,上帝每关上一扇门,就会打开一扇窗。
2013年可能是公司发展的不是很好,工程师又不想自己的努力付之东流,于是他们决定将他们的核心技术开源.这项技术就是docker.当时docker的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移。
无心插柳柳成荫,docker技术风靡全球,于是dotCloud公司改名为docker Inc,并全面投入到docker的开发之中。
2014.6 Docker发布了第一个版本 Docker1.0
2014.7 获得C轮融资 $4000W
2015.4 获得D轮融资 $9500W
至今已经发布到docker v19.03.8 等等
什么是docker?
docker
- Docker is the world’s leading software containerization platform.
- Docker公司开发,开源,托管在Github
- 跨平台,支持Windows、Mac OS,Linux
https://github.com/moby/moby。
docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中.
Linux基础 docker很多命令都与git非常相似。
了解docker的集装箱、标准化、隔离的思想
用形象的类比说明docker的集装箱、标准化、隔离的思想。在用几个工作学习中碰到的问题说明docker解决了哪些问题。
理解Docker
Docker思想
- 集装箱
喜欢docker的logo 集装箱的鲸鱼
没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西。
docker集装箱 程序直接运行
- 标准化
- 运输方式
docker运输东西有一个超级码头,任何地方需要货物都由docker鲸鱼先送到超级码头,然后再由docker鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去。
运输标准化 docker标准化传输过程 执行docker命令就可完成发送传输
- 存储方式
把程序拷贝到笔记本上时,指定一个目录,我们还要记住这个目录,因为下次我们可能还要修改改动东西继续传,有了docker之后就不用,我们就不用记住了程序在哪里了,存储标准化了,我们想使用运行的时候只需要执行一条命令就行了。
存储标准化 想使用运行的时候只需要执行一条命令
- API接口
docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个控制启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令控制它.有了接口标准化,只需要执行同样的命令,就能控制所有的应用,有了docker,我们记docker的命令就可以对其进行操作.
接口标准化 执行同样的命令控制所有的应用 记docker命令执行就好。
- 隔离
我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,可以实现快速的创建和销毁,创建虚拟机可能要几分钟,创建docker只需要一秒.最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术.最大效率的隔离了进程和资源.通过cgroup,namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等,这个机制在7,8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?其实不是这样的,docker成功就像英雄造时势,时势造英雄,如果没有云计算,敏捷开发,高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker.
docker出现解决了什么问题
Docker解决了什么问题?
系统环境不一致
-
系统环境不一致
开发:我本地没问题啊!运维:服务器正常运行也没问题啦.
这个问题就变成了皮球,到谁被踢走
如果一个应用要正常的启动起来需要什么?比如java web应用.
需要一个操作系统,操作系统之上要jdk,tomcat,依赖于我们的代码,配置文件.
操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令.jdk版本也可能导致程序的运行失败.比如class文件需要1.7编译的,机器上装了个1.6的jdk. 版本识别不了
tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持.
代码的话那就更有可能问题多多了,就比如应用了C盘,D盘的一个文件,或者是用了系统的一些环境编码等等
配置的话也是一样,少了某些配置文件,和系统相关的,就是跑不起来.
下面docker来了,它把操作系统,jdk,tomcat,代码,配置都一个个全部放到鲸鱼上集装箱里.再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行.不会有任何的问题.一句话就是docker解决了运行环境不一致所带来的问题.
系统卡
- 系统好卡,哪个哥们又写死循环了
如果大家有跟别人共用服务器的同学可能有这样的体会,莫名其妙发现自己的程序挂了,一查原因要不是内存不够了,要不是硬盘满了,还有就是发现某个服务变慢了,甚至敲终端都比较卡,但是linux本身就是一个多用户的操作系统本身就可以供多个用户人使用,docker的隔离性可以解决这个问题,它是怎么解决的呢?如果放在docker上运行,就算别人的程序还是死循环疯狂吃CPU,还是封装疯狂打日志,把硬盘占满, 还是内存泄漏,都不会导致我们的程序运行错误.因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程.
服务器顶不住
- 双11来了,服务器撑不住了
大部分系统业务量并不是每天都比较平均的,特别是一些电商系统,每天总有那么几天业务量是平时的几倍甚至几十倍,如果按双11的规模去准备服务器那么对于平时的规模来说又是极大的浪费,所以就在节日前临时扩展机器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java,tocmat等等装好多好多东西,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下鼠标,服务器就可以从10台变成100台甚至1000,1W台.都是分分钟的事情.
为什么会这么快呢?
都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题.
总结一下docker的标准化就是快速扩展,弹性伸缩变得简单。