Docker 简介
# 10.Docker 简介
学习 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 是世界级流行的,国内也有很多大厂在用。
新浪微博:
美团:
# 最后
讲了不少基本理论,可能稍微有点枯燥;对于理论,读者们理解为主,不要求死记硬背。
下一篇就开始讲实战了,先从安装开始。