【软件】Docker学习手记(1)
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
为什么需要Docker?
比如说你开发了一个软件,前端基于Nodejs构建,后端使用Python编写,数据库用了MySQL,还用了Redis做消息系统。它们每一个都有特定的版本,都使用了各种第三方的包,也包含了你自己写的各种各样代码文件。
无论是前端还是后端还是数据库什么的,一开始可能非常简单,但是随着开发的推进,代码越来越多,功能越来越多,用到的第三方包也越来越多,项目结构也越来越复杂。
如果这时候你买了一台新电脑,那么要让这个项目能在新电脑上继续开发下去,除了拷贝项目文件之外,你还得安装一大堆的软件,做一大堆的配置,这些头疼的工作可能耗费你几小时甚至几天的时间。
同样,当这种软件在你的电脑上开发完毕之后,要在客户指定的电脑或者云服务器上运行起来,恐怕也不是件容易的事情。
而至于让其他人来接手你的软件,对它进行维护和升级,即使那个人非常懂得编程能够看懂你的代码,但要搞清楚你用了几个月甚至几年不断更迭、配置、修补而成的错综复杂项目结构,也绝对不是件容易事。——实际上,让他能够把你的软件移植到其他设备似乎都是不可能完成的工作。
我们需要一种开发和部署模式,能够在任何可行的设备上快速重建我们软件项目所必要的环境。
我们需要什么?
我们编写的软件并不仅仅是我们自己输入的代码,还要依赖很多别人编写的代码(第三方包Dependences),以及运行在系统上面的其他库和服务(系统库Libraries)。
将软件移植到其他设备上,除了拷贝我们自己编写的文件,还要确保用到的第三方包Dependences也一个都不少,还要确保目标设备的系统环境和我们开发测试时候一致,这不仅要求系统的类型和版本都一致,还要求系统上软件环境和系统配置也都一致。——这不是个轻松的事情。
首先说第三方依赖,我们可能会用Python的pip install 命令安装十数个甚至更多需要的模块Modules,而Nodejs的npm命令直接或间接安装的模块可能有数十甚至上百个。
在编写代码之前,你须要有一个强大且稳定的第三方依赖管理工具。它可以从一开始就准确的记录你所有的安装和卸载模块记录,而且还可以快速的将所有用到的模块打包整理。
你的项目文件应该包含【自己写的代码】和【需要的第三方依赖包】两部分构成。要知道,虽然在目标电脑上批量重新安装这些依赖包听起来很美好,但其中的不确定性一旦发生,你就会头疼的要死。
而至于操作系统环境,唯一可行的就是将你用于开发的操作系统直接连锅端到其他设备上。开发后把整个系统做成一个系统镜像,到目标机器上安装整个系统镜像,然后你就拥有了一切。
——这听起来有些夸张,但使用虚拟化技术来说又是确实可行的,它的问题不在于镜像整个操作系统的文件是否太大,而在于这个操作是否够快。多人共同开发软件的时候,快速的保持开发环境的同步是非常重要的。
同步系统镜像的思路是行不通的,唯一可行的是使用云端的同一个操作系统运行代码和进行测试。——每个开发者的电脑只担当一个代码编辑器的作用,连IDE都不算。
理想的情况什么样?
-
在云端有一台测试服务器,它可以生成不同的系统环境,每个项目单独使用一个系统环境进行开发,各自安装相关软件,各自进行设置,互不干扰。
-
项目团队开发成员在各自的电脑上编写代码并随时将代码文件同步到测试服务器上,测试服务器可以监测到文件的变动,并且可以针对不同文件的改动而更新运行相应的程序。
比如说当它发现后端Python代码文件被更新的时候,它就会自动执行命令来重启这些Python程序;如果它发现Nodejs代码文件发生变化的时候,就自动执行命令重新编译js文件生成新页面代码。 -
当团队开发完成一个新版本并且经过测试之后,直接把测试服务器上运行的整个系统生成一个镜像,再把这个镜像部署到正式服务器之上,甚至部署到多个服务器之上(分布式部署)。
开发过程中,我们可以随时向测试服务器上的Git推送新版本代码,当然也可以随时把代码版本同步到其他Git服务上,例如Github。
最好我们也可以随时把整个系统镜像进行备份,生成多个版本。——这就需要镜像文件不要太大,生成镜像的时间也不要太久。
在我们的这个梦想中,Docker将扮演的正是镜像生成、管理和部署的角色。
<未完待续>
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~
END