开发者学堂课程【Docker 快速入门:Docker 产生的背景】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/850/detail/14025
Docker 产生的背景
内容介绍
一、Docker 产生的背景
一、Docker 产生的背景
先来思考问题:为什么会有 docker 出现
一种技术产生的前因后果、前提背景是什么,为什么会慢慢成为主流热门甚至是后续软件开发的一种标准。
接下来来解释为什么会有 docker 的出现,docker 用在什么地方,解决了什么痛点,解决了什么问题。
总结一句话:在日常工作开发中
如上图,左侧是开发,右侧是运维。
传统上在未学习 docker 前开发工程师提交给运维产物:代码,war 包。例如当项目完成后,通过 double 获取了多个包,这时使用包进行一个个架包,包括刚才上节完成的 cloud 项目,发布到集群环境中,部署到多个 component 下,那么交给运维的是代码和 war 包。交给运维的前提是开发本机上没有任何问题。运维的工作是进行部署,但此处有开发和运营交付软件时经常产生矛盾的问题。
思考:为什么代码在开发时运行正常而在运维时运行不出结果?
一款产品从开发到上线,从操作到系统,从运行到环境,再到应用配置,再加上代码,即使运维工程师不改变开发工程师的代码,操作系统、运行环境等也会发生变化,开发上可以运行是因为在一定的环境中,有一定的配置文件,若出现任何问题,开发都运行正常而运维就不能运行。所以作为开发和运维之间的协作需要关心很多东西,这也是很多互联网公司不得不面对的问题,特别是各个版本更迭之后,不同版本环境的兼容,越来越复杂,例如需要加支付接口、软件证书、
命令行、公钥密钥等对运维人员都是考验。
所以开发和运营交付软件和部署上经常会发生矛盾,导致产生差异的根本原因是双方的环境和配置不同。例如现在开发是在 windows 下开发,但是运维部署需要部署到阿里云上,此时环境发生变化就会有不同。
为了解决这个问题,Docker 应运而生。
开发工程师将自己运行 ok 的环境中的代码、配置、系统、数据等整体打包给运维工程师,那么运维工程师就可以在相同环境下进行运行。
环境配置很麻烦,换一次机器就要重来一次,费力费时。
很多人想到从根本上解决问题,软件可以带环境安装。即运维工程师不再是安装一个个软件,而是去复制和开发人员一模一样的整体的原始环境,比如环境配置。开发人员就可以利用 Docker 可以消除协作编码时“在我的机器可以正常工作”的问题。
先简单浏览上图,以前只需要开发者提交代码,现在是提交整个环境:代码,配置,数据,系统等。Docker 有一个重要概念即三要素之一:镜像,上述一整套即为镜像,以前的代码只是应用,只需要写完代码编译成文件,形成源代码,由运维去部署。
而现在不再仅仅提交代码,还包括运行文档,配置环境,运行环境,运行依赖包,内核等可以正常运行的整个环境配置,带着环境安装到 docker 上,让运维工程师进行发布,运维就可以将原始环境一模一样的复制过来,消除了在开发工程师处能运行,在运维处不能运行的问题。
程序员最终的目的是编码的作品能够上线,最后就是部署。而现在由于互联网高并发的环境和大流量的访问,出现了集群环境:交回的代码有可能是十台。而每一台都需要安装数据库和 redis 等,运维工程师工作量太大。此时思考怎么将整个软件复制,在一台机器上装过了 redis、monggodb 等,下一台机器上也需要这么安装,就需要将相同的代码抽取出来形成公用的方法对外暴露,就不需要再进行各处编码,只需要调一次。同样 docker 的任务就是将现在良好的软件运行环境打包封装成镜像。需要安装的每台机器上都有镜像就完成了。
这个理念就是 Docker 的雏形。不再交代码,而是交镜像。
镜像是含有代码以外的包括运行文档、配置环境、运行环境、运行依赖包、操作系统发行版,内核等原始环境。保证可以正常运行。
之前服务器上配置一个应用的运行环境需要安装各种软件,例如尚硅谷电商项目的环境,安装和配置 Java/TomcatMySQLJDBC 驱动包等很麻烦,并且不能跨平台。例如是在 Windows 上安装的这些环境,那么在 Linux 上需要重新装。即使不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java 为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker 镜像的设计,使得 Docker 得以打破过去「程序即应用」的观念。透过镜像( images )将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
类似于 java 虚拟机概念,一次编写处处运行。Docker 的理念是“一次构建,处处运行”。