docker出来也有不少年了,但用到的公司其实并非不少,docker对传统开发是一个革命性的,几乎颠覆了以前咱们传统的开发方法和部署模式,而大多html
公司保守起见或不到万不得已基本上不会去变动现有模式。java
一:Docker出现以前咱们都有哪些困惑mysql
1. 应用依赖多,系统参数配置杂,部署起来麻烦web
这句话怎么理解? 拿真实案例说,好比你能够看一下我以前写的一篇安装elasticsearch的博文:http://www.javashuo.com/article/p-rdvrhtqb-bc.htmlredis
《1》 因elasticsearch是java写的,因此你须要安装java运行环境,而后屁颠屁颠的去官网下载,接下来还要配置 java_home 变量等等。sql
《2》 es5.0以后的启动不能使用root帐号,你不得不新建用户和用户组,烦。mongodb
《3》 而后你启动可能会遇到:os::commit_memory(0x00000000a9990000, 1449590784, 0) failed; error='Cannot allocate memory' 内存不足的状况。docker
《4》 而后就是文件句柄不足:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 的异常。api
《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系列的整个流程。