🟧1. 为什么要用 Docker
我们知道,一个项目从开始开发到开发完成部署上线,往往要经历开发、测试、上线三个阶段,与之对应就是开发环境(用于开发项目)、测试环境(用于测试开发好的项目)和生产环境(测试通过的项目,部署上线)。
那么,这样就会带来一个问题。将开发并测试通过的项目打包成 jar 或 war 包,就可以直接在生产环境中运行了嘛?
答案是否定的。因为开发和生产往往是不同的环境,在开发时,应用需要依赖相应的配置和配置文件,项目部署上线同样需要进行配置,部署过程中往往还要考虑到软件或配置的版本等因素。否则,就会出现在开发环境上运行正常的项目,到了部署的时候死活都运行不了这种情况,为了解决问题,耗费了大量的时间和精力在配置环境上面。
因此,就出现了一个诉求:能不能像打包项目源码那样,把项目运行所需要的环境也一起打包复制过来?这样在部署的时候,直接安装就好了不需要再次进行复杂的环境配置操作,对于运维同学来说简直就是福音啊!
这次的答案是肯定的!Docker 的出现就是为了解决这个难题,提出了一个标准化的解决方案,利用容器虚拟化技术,让系统平滑移植,使得复制运行环境变成可能,使得 “开发环境能跑,部署上线跑不了” 的窘境不再出现!
🟧2. Docker 理念
Docker 是基于 Go 语言实现的云开源项目,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker 允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。 -------------《维基百科》
它的理念便是 “Build, Ship and Run Any App, Anywhere”,通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的应用及其运行环境能够 “一次构建,到处运行”。
Docker 是在 Linux 容器技术的基础上发展而来的,将应用打包成镜像,通过镜像成为运行在 Docker 容器上的实例,而 Docker 容器在任何操作系统上都是一致的,因此实现了跨平台、服务器。
Docker 解决了运行环境和配置问题,是一种方便做持续集成并有助于整体发布的容器虚拟化技术。
🟧3. 虚拟机与容器虚拟化技术
🟠3.1 虚拟机技术
虚拟机(Virtual Machine)就是带环境安装的一种解决方案,是对硬件的虚拟化。它可以在一种操作系统里面运行另一种操作系统,比如在 Win10 系统里面运行 Linux 系统 CentOS 7. 应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
然而,虚拟机技术也有一些缺点:
占用资源。虚拟机需要占用主机的 CPU 、内存空间和网络资源等。
冗余步骤多。新建一个虚拟机,需要进行很多的配置操作。
启动慢。启动虚拟机一般需要几十秒到几分钟的时间。
🟠3.2 容器虚拟化技术
Linux 为了弥补虚拟机技术的缺点,发展出了另一种容器虚拟化技术,Linux 容器 (Linux Containers,LXC) 技术。
Linux 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker 容器是在操作系统层面上实现虚拟化,复用本地主机的操作系统,与传统的虚拟机相比,Docker 占用体积小、启动速度块。
Docker 容器和传统虚拟化技术的区别:
传统虚拟机技术虚拟出一套硬件之后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核也没有进行硬件虚拟,比较轻便。
每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相会影响,能够区分计算资源。
- 。
🟧4. Docker 可以做什么
🟠4.1 更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker 化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
🟠4.2 更便捷的升级和扩容
随着微服务架构和 Docker 的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个 Docker 容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
🟠4.3 更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的 bug. 当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
🟠4.4 更高效的计算资源利用
Docker 是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的 Hypervisor 支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的 CPU 和内存资源的利用率。