docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多
公司保守起见或不到万不得已基本上不会去变更现有模式。
一:Docker出现之前我们都有哪些困惑
1. 应用依赖多,系统参数配置杂,部署起来麻烦
这句话怎么理解? 拿真实案例说,比如你可以看一下我之前写的一篇安装elasticsearch的博文:javascript:void(0)
《1》 因elasticsearch是java写的,所以你需要安装java运行环境,然后屁颠屁颠的去官网下载,接下来还要配置 java_home 变量等等。
《2》 es5.0之后的启动不能使用root账号,你不得不新建用户和用户组,烦。
《3》 然后你启动可能会遇到:os::commit_memory(0x00000000a9990000, 1449590784, 0) failed; error='Cannot allocate memory' 内存不足的情况。
《4》 然后就是文件句柄不足:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 的异常。
《5》 然后就是虚拟内存不足:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 的异常。
其实我的初衷就是想安装下es,结果来了这么多的坑,烦不胜烦,要解决上面这些问题,我只需要9行代码搞定,你信不?可以说秒级部署。
1 version: '3.0' 2 services: 3 elasticsearch: 4 image: elasticsearch:5.6.14 5 ports: 6 - 9200:9200 7 volumes: 8 - "/data/elastic/store:/usr/share/elasticsearch/data" 9 - "/data/elastic/logs:/usr/share/elasticsearch/logs"
2. 分布式部署麻烦
搭建es的时候,通常为了高可用需要部署到几台机器上,麻烦来了,你又需要在其他机器上做一遍同样的事情,烦不烦呢? 如果用了docker,你就可以
把上面9行代码稍微改一改就可以搞定。
3. 系统垃圾多
收集日志有了es,产生日志的程序用netcore,要跑core程序你还要安装core的runtime,久而久之服务器里面什么语言环境以及各种环境的各种版本都有,
往往给你带来了意想不到和防不胜防的bug,而docker的解决办法就是将每个应用程序和它所属的相关依赖都锁在一个叫做容器的盒子里面,这样就可以起到
相互隔离,从而不污染宿主机的系统环境。
4. 应用之间启动顺序搞蒙
如果你开发的网站有很多技术栈,在生产部署的时候肯定有一个启动的先后顺序,比如基础服务(redis,mongodb,mysql) 要先启动,然后才能启动
webapplication和kibana,如果你换了顺序带来了就是一堆报错,那有没有一种办法可以预先配置好各个应用的启动顺序的呢?在docker中你只需要用
depends_on命令就可以搞定启动顺序。
上面提到的四大问题,或许多多少少你都遇到过,而这些问题对docker来说都不是问题,所以学好docker还是有一定必要的。
二:Docker介绍
docker的官方网址是:https://www.docker.com/
上面这张图给你的感觉认知是不是下面这样:
1. docker 就是一条大鲸鱼,和货船有的一拼。
2. 大鲸鱼上有很多的集装箱,集装箱里装的自然就是货物了,感觉集装箱就是规整,隔离货物用的,上海有很多码头都有这种集装箱,不知道有多少人
亲眼见过哈,类比到docker上就是容器里面装了你的应用程序和相关依赖啦。
总体上来说,docker就是用类似集装箱的概念解决我之前提到的四个问题。
三:Docker架构图和核心概念
Docker 是一个典型的CS模式架构,和Docker deamon通信有Docker client命令行模式,也可以自己调用deamon提供的api方法和其进行通讯。
1. 镜像
这个里面保存了你的应用和需要的依赖环境,比如netcore的runtime和webapplication。
2. 容器
如果说镜像是class,那容器就是new class(),真正的将你的镜像跑起来了,前面也说到了它是一个隔离的盒子,它其实并不关心盒子里面是什么,
以及盒子当前在哪个平台上。
3. hub
它是一个远程的存放镜像的平台,hub上有很多已制作好的镜像,比如redis,mongodb,我们只需要pull下来直接使用,或者自己制作镜像。
四:docker 和 虚拟机的区别
严格来说他们之间没有可比性,因为他们的初衷本身就是不一样的,虽然都用到了虚拟化技术,这就好比,开兰博基尼的人和开五菱宏光的人,
虽然都是烧汽油的,但开兰博基尼的帅哥是为了泡妹子,耍酷,凸显身份地位的,而开五菱宏光的小哥是为了竟可能多的拖货养家糊口,顺带也
能多拖点人,所以两者初衷不一样,没有可比性。 docker就是为了在云计算时代解决优化和快速部署的问题,而虚拟机是为了虚拟出一个物理机
来尽可能的合理使用CPU,内存,磁盘等其他用途。
这篇就和大家简单的胡侃一下,后面我准备用一个core的小案例贯穿于docker系列的整个流程。