Docker 快速入门_容器_技术课程_开发者学堂

阿里云
为了无法计算的价值
打开APP
阿里云APP内打开
开发者社区> 开发者学堂> 全部课程> Docker 快速入门

Docker 快速入门

31课时 |
363人已学 |
免费
课程介绍

欢迎报名2021开发者技能竞技大赛!

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker官网:https://www.docker.com/

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的理念是“一次构建,处处运行”。