1. Docker是个什么玩意
说Docker是什么之前,先来看一看Docker为什么会出现。我们知道,在学习过程中我们需要频繁地安装配置一些软件,不管是在Windows下还是在Linux,这些东西的配置过程都是非常费时费力的,稍有不慎就得删了重来,换一台机器,还得重来一次,更讨厌的是经常出现一些环境的兼容性问题(比如一些软件只兼容win7)。那么有没有这样一种解决方式:软件带环境安装,省去麻烦的安装配置过程,并且完全不用考虑环境兼容问题,因为自带环境嘛。也就是说,安装的时候,把原始环境一模一样地复制过来(上面说了,有一些软件不兼容win10,那我就在win7上装好,将软件和系统揉成一坨,拿到win10上使用)。
粗暴的总结成一句话:Docker就是这么个玩意儿——应用程序+运行环境所构成的容器。
2. Docker的践行理念
通过上文,我们大致知道了这是个什么东西,接下来我们看看Docker的设计理念。
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。依托Docker技术, 我们可以把应用程序和它所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。 只需要一次配置好环境,换到别的平台、环境上就可以一键部署好,极大地方便了应用部署运维 。
总的说来:大家知道java是一门跨平台语言,一次编译,到处“调试”;而Docker真的做到了,一次构建,到处运行!!
3. 浅谈虚拟化技术
大佬说了一句话:
Docker是解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器化虚拟技术。
这句话提到了虚拟化和容器化两个技术名词,接下来我们来简单了解一下这两个玩意儿。
3.1 之前的虚拟化技术:
大家肯定都接触过的虚拟化技术——虚拟机(例如:vmware)。虚拟机就是一种带环境安装的解决方案,它可以在一种操作系统里面运行另一种操作系统,比如说在Windows里面运行Linux系统(Vmware虚拟出一套硬件平台,Linux就是运行在这套平台上的)。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。 简单画个图感受一下:
注意:APP是运行一层虚拟化出来的硬件平台上,这样的虚拟机具有以下缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
3.2 容器化虚拟化技术:
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较了 Docker 和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
3.3 对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB |
一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
4.从DevOps的角度看Docker(选看)
4.1 更快的应用交付和部署:
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
4.2 更便捷的应用升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
4.3 更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
4.4 更高效的利用系统资源
Docker是内核级虚拟化,直接运行在硬件平台上,它不像传统的虚拟化技术一样需要额外Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利率。
除此之外,还有更快速的启动、保证一致的运行环境、持续交付和部署、更轻松的迁移。。。。
总而言之:Docker天下第一 ~
既然Docker这么完美,那么我们是不是对着它该来一发?下篇笔记记录了怎么撸它~
参考文章:
[1] 周阳.Docker基础篇之快速上手
[2] 李卫民.Docker文档