学习 Docker 之前,先了解 Docker 为什么出现,解决了什么痛点;然后简单介绍 Docker 是什么。
在 Docker 出现之前
假如你在自己的笔记本上,开发一个商城项目,那么开发环境就是你自己的笔记本,并且该开发环境具有特定的配置;而其他同事也有自己的本地开发环境,并且配置一般是互不相同的(比如使用的 IDE 不同,项目位置不同,端口号和数据库连接信息不同… 等等)
除此之外,在测试环境和生产环境中,配置也是不同的,那么在部署过程中,经常会出现版本和配置问题(俗称环境问题)。
为了解决环境问题,容器技术出现了(例如 Docker)。Docker 之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
环境配置是相当麻烦的,例如安装 Java,Tomcat、Nginx 等;换一台机器,又要重新安装一遍,费力费时。那能不能从根本上解决问题:软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作,在其他机器上不行”的问题。
除此之外,还能解决扩容和缩容的问题:想要增加一台服务器,那么只需在上面用 Docker 复制一份开发环境即可,非常方便。
Docker 还能解决跨平台的问题,比如一个项目是在 Windows 下开发的,那么使用 Docker,项目也能在 Linux 和 Mac OS 下运行。
Docker 的出现使得过去「程序即应用」的观念被打破。透过镜像(images)将项目,运行项目所需要的系统环境等信息,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
镜像就好比一个打包好的环境,里面包含了源代码 + 配置 + 环境 + 版本。
比如,使用虚拟机安装 Centos 的时候,就用到了 Centos 镜像,直接安装该镜像,安装好后就可以获得一个 Centos 服务器。
注意,容器技术的出现,使得开发也要慢慢的兼顾运维的一些工作。
Docker 是什么
Docker 是基于 Go 语言实现的云开源项目。
Docker 的主要目标是“Build, Ship and Run Any App, Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的 APP(可以是一个 WEB 应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Docker 是在 Linux 容器技术基础上发展过来的。将应用打成镜像,通过镜像成为运行在 Docker 容器上面的实例,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
一句话:Docker 是解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker 的图标是一个鲸鱼,上面有很多的集装箱。Docker 借鉴了标准集装箱的概念,标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件
容器与虚拟机比较
传统虚拟机技术
虚拟机(virtual machine)也是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在 Windows10 系统里面运行 Linux 系统 CentOS。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox 和 VMWare 等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。示意图:
由于模拟出了硬件以及操作系统,传统虚拟机技术有如下缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
对于开发人员来说,重点是复制应用,而不是模拟各种硬件和操作系统。
容器虚拟化技术
由于前面虚拟机存在某些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量,并保证部署在任何环境中的软件都能始终如一地运行。示意图:
对比
- 传统虚拟机技术在硬件层面实现虚拟化。虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器虚拟化技术:在操作系统层面上实现虚拟化,直接复用本地主机的操作系统。容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便,启动速度快,占用体积小。
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
总结下为什么 Docker 会比 VM 虚拟机快:
(1)Docker 有着比虚拟机更少的抽象层:Docker 不需要 Hypervisor(虚拟机)实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 Docker 将会在效率上有明显优势。
(2)Docker 利用的是宿主机的内核,而不需要加载操作系统 OS 内核
当新建一个容器时,Docker 不需要和虚拟机一样重新加载一个操作系统内核,进而避免引寻、加载操作系统内核返回等比较费时费资源的过程。当新建一个虚拟机时,虚拟机软件需要加载 OS,过程是分钟级别的。而 Docker 由于直接利用宿主机的操作系统,省略了加载 OS 过程,因此新建一个 Docker 容器只需要几秒钟。
Docker 容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享 OS | 宿主机 OS 上运行虚拟机 OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk,vdi 等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的 CPU、内存消耗 |
移植性 | 轻便,灵活,适应于 Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,分钟级 |
使用 Docker 的好处
这里做个小结:
- 更快速的应用交付和部署:传统的应用开发完成后,需提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker 化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间
- 更便捷的升级和扩缩容:随着微服务架构和 Docker 的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个 Docker 容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
- 更简单的系统运维:应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的 BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复
- 更高效的计算资源利用:Docker 是内核级虚拟化,不像传统的虚拟化技术一样需要额外的 Hypervisor 支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的 CPU 和内存的利用率(也变相节约了服务器,省钱)。
哪些企业在用
Docker 是世界级流行的,国内也有很多大厂在用。
新浪微博:
美团:
最后
讲了不少基本理论,可能稍微有点枯燥;对于理论,读者们理解为主,不要求死记硬背。
下一篇就开始讲实战了,先从安装开始。