开发者学堂课程【Docker 快速入门:Docker 产生的背景】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9385
Docker 产生的背景
内容简介:
一.Docker 是什么
二.Docker 能干嘛
三.Docker 在哪下载
一、Docker 是什么
1、问题:为什么有 Docker 出现?
Docker 是什么?我们首先要抛出问题,一门技术为什么会出现?为什么会有Docker 出现,一种技术诞生的前因后果和前期背景是什么?为什么会慢慢的成为主流?成为现在的热门甚至成为后续软件开发的一种标准,接下来看看为什么会有Docker 的出现,我们为什么要学习 Docker?它用在哪里,解决了什么样的问题?
此图左边为开发,右边为运维;传统上,按照在没有 Docker 之前,开发工程师负责给运维提交产物,例如代码和 war 包。
举例说明:我们的项目完成以后,打包成 N 个,就会有 N 个架包。比如 Cloud 项目完成以后发布到集群环境里面,部署到多个门派;我们交给运维的是代码和 war包,既然提交给运维,前提一定是开发本机安好,那么右边运维工程师的角色是开始部署。
但是经常会出现开发和运维之间推诿,例如运维跟开发说跑不对,此时开发说这个数据没问题,在他本机是好的,然后运维认为开发写的代码有问题。所以为什么会出现在开发时完好,运维部署时就不对的情况呢?
运维工程师不会私自去改动代码,也许有些运维工程师熟悉数据库和 Linux,但他不懂 Java 等等,也就是架包。最终有一种情况直接导致两位产生差异,就是环境和配置。例如开发工程师是在 Windows 下面开发,但是他要部署到阿里云等系统上面,此时环境改变,就完全不一样了,所以衍生出一种情况:一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。
Docker 之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
就是开发把完好的环境,代码、配置、系统、甚至是数据等等,总的来说就是整体打包给运维。此情况下,如果代码在这样的配置、系统、数据、环境下面能运行,把它整体放到运维,也能运行。
环境配置如此麻烦,换一台机器,就要重来一次,费时费力。很多人想到,能不能从根本上解决问题,软件可以带环境安装?
也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker可以消除协作编码时“在我的机器上可正常工作”的问题
观看此图,以前我们只交代码,现在要交整个环境。Docker 里面有一个重要的概念,也是 Docker 的三要素之一—镜像,那么这一整套就叫镜像,以前代码只是应用,我们只需把代码编译成一些文件、产权代码等等交给运维,由运维去部署。
但是现在不再是只提交代码,还要交除了代码以外运行的文档、配置的环境、运行环境等。那么把这些当前该功能稳定运行的整套环境安装到 Docker 上面,然后让运维工程师发布,此时就可以把原始环境一模一样的复制过来,消除了在开发能运行,在运维工程师不能运行的问题。而运维还有一个概念,运维工程师部署的时候,最终体现的价值是编码出现的项目系统,作品要上线最后一步就是部署。现在由于互联网高并发的环境和大流量的访问导致出现集群环境(多台代码),例如你交过来的代码是 10 台,每一台都需要去安装数据库等,运维需要承受的压力太大,此情况下,我们把软件复制下来,在一台机器上装过的代码,同样还要装很多台,我们要把相同出现的代码抽取出来形成一个公用的方法,就是把这个软件运行环境打个包封装成一个东西叫镜像,然后需要安装的每个人都有这个一份镜像就可以了,那此时这种理念就是Docker理念的雏形。
所以说,以前交代码,现在交镜像。就是含除了代码以外还有原始的环境,保证大家能够正常运行。
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿尚硅谷电商项目的环境来说吧,Java /Tomcat/MySQL /JDBC 驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等( Java 为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。
不过,即便如此,仍然常常发生部署失败的情况。Docker 镜像的设计,使得 Docker 得以打破过去「程序即应用」的观念。透过镜像( images )将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。Docker 接近于 Java 虚拟机的理念,Java 代码的理念是一次编辑,处处运行,Docker 理念就是一次构建,处处运行。