Docker synopsis
- website address
- Docker series
- 2.1 今日课程介绍
- 2.2 初始docker - 什么是docker
website address
url address
Docker series
2.1 今日课程介绍
2.2 初始docker - 什么是docker
项目部署的问题
大型项目组件较多, 运行环境也较为复杂,部署时会碰到一些问题.
特别是微服务, 各种各样的微服务,而且这些微服务还会依赖于各种各样的应用; 比如说,前端部分肯定依赖node.js吧, 而我们服务端还需要数据库mysql,缓存系统redis,还有我们后面会学习到的异步通信(mq,rabbitmq?)等等这些,更多,这些只是其中一些,
所有这些应用将来都需要部署到我们的服务器上,而大多数的服务器都会采用Linux系统;
应用在安装在操作系统上面之前,要做一些准备工作,因为这些应用依赖都会有自己所需要的依赖和函数库;
每一个不同的应用,它们所需要的依赖和函数库可能有差异,也可能一样,但是版本不同(不同应用);
这个时候,如此复杂的一个依赖关系,很容易产生兼容性的问题,而且当兼容性问题解决,发现只是开始, 因为开发,测试和生产环境有差异,预发布,可怕的是这些操作环境的linux操作系统还可能不同,
比如,装了个centos系统,另外环境装的是Fedora系统,还有装的是Ubuntu系统,那怎么办?
一个操作系统里面配好的东西放到另外操作系统,还能正常运行吗?no
以前开发部署时的效率非常的低,这个问题docker是如何解决的呢?
既然每个应用都有自己所需的依赖和函数库,why not打包应用的Libs函数库,deps依赖,配置与应用一起打包,docker就干了这件事情,
Nodejs需要什么依赖,打包起来,形成一个整体,还将每个应用放到一个隔离容器去运行,避免互相干扰,每个应用需要什么我都这么去做(打包依赖和函数库到一个隔离容器去运行)
打一个包,一起扔过去,不用考虑依赖和函数库问题,有同学说,把他们扔到一台机器上,它们之间(隔离容器们)的依赖难道没有干扰吗? 不会,因为docker会把这些打包好的程序,用一个隔离的容器去运行,会用到一种沙箱的技术,它们相互之间不可见,这个问题不就解决了吗?这只是解决了混乱依赖的问题
有了docker,应用程序随时都可以运行.仅限于同样的一个操作系统,因为打包时,肯定基于某种操作系统去打包.
比如这个应用(node.js)是鲁班图ubuntu version,那它的依赖和函数库也肯定是ubuntu乌班图的;
你把这个打包好的程序(eg, node.js)扔到centos上去;程序运行不了;docker怎么来解决这个问题呢?
要想了解docker跨系统运行,我们得先知道OS的structure;
这儿以ubuntu为例,给大家讲一下OS structure;别着急; 没那么复杂,
所有的Linux内核的操作系统, 都可以分成两层;一层是大家共享的内核(Linux内核),
不管是ubuntu,centos,fedora,redhat,他们的内核都是linux; 区别是上层系统应用的不同; ubuntu和centos它们的应用是不一样的, (它们的))内核是相同的;
内核干什么事呢? 内核负责与计算机硬件进行交互,eg, 我去调用一下CPU, 调用一下内存, 读一下文件,开辟一个进程之类的; 这些都是内核要做的, 而内核会把这些事情变成一个一个的指令;
你调用这些指令就可以操作计算机硬件了,但可惜的是这些指令大多比较简陋; 如果你要基于这些指令去开发应用,那可就太麻烦,所以说我们就有了系统应用;
系统应用, 比如说ubuntu,它干了什么? 它会将内核的指令进行一个组装, 再封装, 形成函数, 区域多的函数形成了函数库.
那么程序员可以基于这些函数库进行开发,程序调用我们的函数/函数库, 函数库调用内核指令去调用我们的计算机硬件,从而实现我们这个应用的执行;
这就是我们linux系统的一个结构,以及应用的执行原理.
问题来了, 一个ubuntu系统上的应用,为什么不能在centos上运行,两个系统内核一样,系统应用不同,也就是说函数库不同;
可能ubuntu上的函数库centos上不一定有,或者名字不一样;
这个时候我们把一个ubuntu上的mysql应用迁移到centos上,尝试去执行, 你会发现,当他去调用一个函数库,因为代码写死了, 函数库(ubuntu)在centos上根本不存在; 那肯定会程序报错; 这就是为什么我们应用不能跨系统运行原因.
那针对这样一个问题, 我们docker干了什么事情?
既然每个应用都依赖于系统函数库, 我为什么不把它的系统函数库跟它一起打包呢? 这样一来,不愁找不到函数库了吗?
所以docker的解决方案就是将用户程序与系统调用的这个函数库一起打包.
也就是说(for instance/sample)我来打包一个这个需要自己的一些依赖的mysql, 同时mysql需要一些比如ubutu的系统函数库;
然后我们就把mysql自己的依赖和ubuntu的函数库打包成一个整体, 我们的mysql, nodojs等应用,你随便放在任何的只要是linux内核的linux操作系统上,
通过这种方式,docker就解决了应用执行跨系统的问题