Docker简介
“驮着集装箱的鲸鱼”
0x00 是什么
1、为什么会有docker出现?
思考一下,任何事物的产生,是为了解决一个痛点。就像我们之前没有微信和支付宝,照样活得好好的,照样能交流,但是他们解决了什么?同理,Docker出现前和出现后,是什么样子的?
假设你正在开发一个项目,使用的是一台笔记本而且你的开发环境具有特定的配置。其他开发人员身处的环境配置也各不相同。甚至还会有特定的配置文件,此外,公司还具有自己的一套标准化和生产环境,也具有自身的配置和一系列依赖文件。这就导致了,开发人员跑得好好的,运维或者售前拿到后,运行不起来。
那么如何确保应用能够在各个环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案——==系统平滑移植,容器虚拟化技术。==
环境配置相当麻烦,换一台机器,就要重来一次,费时费力。很多人想到,能不能从根本上解决问题?软件可以带环境安装?也就是说,==安装的时候,把原始环境一模一样地复制过来。开发人员利用Docker可以消除协作编码时“在我的机器上可以正常工作”的问题。==
Before
总结,三个问题会导致公司内耗严重
1、如何解决不同环境,不同标准,不同版本与不同配置文件之间的差异?
2、如何解决多台集群机器安装复杂效率低的问题?
3、如何解决机器扩容、缩容秒级别的问题?
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让运维团队得以部署应用程式,开发需要清除地告诉运维部署团队,用的全部配置文件+所有软件环境。
Docker的出现,使得Docker得以打破过去[程序即应用]的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台之间的无缝接轨运作。
所以我能不能将开发测试好的各种物件,打个包,直接送过去?
说白了,我们有Docker之前,每次都是搬家,一定会产生问题,一定会产生物件损耗。有了Docker之后,我直接搬整栋楼过去,规定限制死了运输过程。Docker起的就是这么个作用。
2、Docker理念
有了Docker,开发也要逐渐有了运维的思维。之前,开发直接给运维代码就不管了,现在,可以直接给运维,让他一键部署,一气呵成。
结论:一次镜像,处处运行,从搬家到搬楼。(总分总,三板斧)
那么多人学开发、渗透,都是不同的系统和品牌,我们都用vmware workstation来保证运行的是同一个虚拟机,保证了环境迁移的一致。
Docker更狠,把它发扬光大。它将所有开发的文件、配置、依赖文件等等,都归一规划成一个镜像,这就是一次镜像,处处运行,从搬家到搬楼。
那么多个Docker效果都是一样的,接着奏乐,接着舞。全场动作跟我整齐划一!
3、Docker
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是Build, Ship and Run Any App, Anywhere
,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或者数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。避免版本缺失,环境不同等开发错误问题,完整部署上线。
Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
总结
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
0x01 容器与虚拟机的比较
这是一道经典的面试题。
1、容器发展简史
2、传统虚拟机技术
这么一套确实可以解决不同环境安装的方案,但是痛点是什么??
- 资源占用多,动不动就新建一个硬盘啥的
- 冗余步骤多,有些步骤根本就不需要,但是还是得装
- 启动慢,安装一台虚拟机没个几分钟几乎是安装不上的
那么怎么优化呢?
就拿CVE复现来说吧,假设一个CVE装一台机器,3个就是3台,我能不能直接装一台机器上啊?而且我仅仅需要个LAMP环境就行,别的什么桌面、声音,那么多的硬件我都不需要行不行?这就是Docker
只用最小巧的Linux内核来支撑我的软件,这样的话,步子比较轻,速度比较快。
3、容器技术与Docker技术
由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:
Linux容器(Linux Containers,缩写为LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。这也就是为什么说Docker是个”背着集装箱的鲸鱼”。
比较Docker和传统虚拟化方式的不同:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程层,很麻烦哦
- 容器内的==应用进程直接运行于宿主的内核(复用技术)==,容器内没有自己的内核==且也没有进行硬件虚拟==。因此容器要比传统虚拟机更为轻便。
- 每个容器(集装箱)之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
Docker只启动仅需要的即可,虚拟机是完整系统再启动应用。
0x02 Docker能做什么呢?
有了之前的铺垫,对Docker的理解,现在逐渐弱化了开发与运维的分界。以前有一个词叫做全栈工程师。前端后端都要懂。但是现在呢?前端有H5什么的,后端有数据库,大数据,C++服务器什么的,太多了,根本学不过来。也就逐渐回归到了自己的职位上了。就跟村长临时让大家集合,结果刚叫出来,大家就各回各家了。
1、技术职级变化
coder(just copy and paste)——programmer(懂了一些规范以及行内标准等)——software engineer(developers)——有了Docker后,DevOps engineer(开发运维混合型工程师)
希望自己能够盯紧技术和本事的发展,不要整天只会说 格子衫啊,掉头发,光头了,找不到女朋友了,没有办法在生活中面向对象了,全他妈扯淡啊。我身边干IT的混的都挺好的,黑不过他们。专注于自己好吧。
2、开发/运维(DevOps)
更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,运维人员安装部署后需要根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署和测试验证时间。
更便捷的升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的小时级别变成分钟级别甚至妙级别。
更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用
Docker是内核级虚拟化,我只需要核心的支持,不要不必要的东西。其不像传统的虚拟化技术一样需要额外的Hypervisor
支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
3、Docker的应用场景
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是,集装箱运输货物,而Docker运输软件。
4、哪些企业在用?
新浪
美团
蘑菇街
0x03 去哪儿下
https://www.docker.com/ docker官网
https://hub.docker.com/ 安装docker镜像的仓库