8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍
docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多
公司保守起见或不到万不得已基本上不会去变更现有模式。
一:Docker出现之前我们都有哪些困惑
1. 应用依赖多,系统参数配置杂,部署起来麻烦
这句话怎么理解? 拿真实案例说,比如你可以看一下我之前写的一篇安装elasticsearch的博文:https://www.cnblogs.com/huangxincheng/p/9120028.html
《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行代码搞定,你信不?可以说秒级部署。
version: '3.0'
services:
elasticsearch:
image: elasticsearch:5.6.14
ports:
- 9200:9200
volumes:
- "/data/elastic/store:/usr/share/elasticsearch/data"
- "/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系列的整个流程。
8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍的更多相关文章
- docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...
- Docker学习第一天(Docker入门&&Docker镜像管理)
简介 今天小区的超市买零食老板给我说再过几天可能就卖完了我有点诧异,老板又说厂家不生产了emmm 今天总算开始docker了! 1.Docker? 1.什么是Docker Docker 是一个开源的应 ...
- Docker系列(七):Docker图形化管理和监控
Docker管理工具之官方三剑客 Docker Machine是什么鬼 从前 现在 你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其 能运行Docker容器. Docke ...
- Docker系列二:Docker的基本结构
Docker的基本结构 Docker 的三大基础组件 Docker有三个重要的概念:仓库 , 镜像 和 容器 ,它们是Docker的三大基出组件 Docker的组织结构 Docker处于操作系统和虚拟 ...
- Docker系列一:Docker基本概念及指令介绍
1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用 ...
- 【Docker】第一篇 Docker的初始化安装部署
一.Docker基础 Dacker倡导的理念:一个容器一个进程 Docker的版本了解: Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人 ...
- Docker系列一:Docker的介绍和安装
Docker介绍 Docker是指容器化技术,用于支持创建和实验Linux Container.借助Docker,你可以将容器当做重量轻.模块化的虚拟机来使用,同时,你还将获得高度的灵活性,从而实现对 ...
- Docker系列(五):Docker网络机制(上)
Linux路由机制打通网络 路由机制是效率最好的 docker128上修改Docker0的网络地址,与docker130不冲突 vi /usr/lib/systemd/system/docker.se ...
- Docker系列(三):Docker自定义容器镜像
将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...
随机推荐
- Django REST framework+Vue 打造生鲜超市(十三)
目录 生鲜超市(一) 生鲜超市(二) 生鲜超市(三) 生鲜超市(四) 生鲜超市(五) 生鲜超市(六) 生鲜超市(七) 生鲜超市(八) 生鲜超市(九) 生鲜超市(十) ...
- 洛谷 P2764 解题报告
P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...
- Java CAS 原理分析
1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制(可以把 CAS 看做乐观锁).CAS 操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...
- C# 插入、删除Excel分页符
引言 对Excel表格设置分页对我们预览.打印文档时是很方便的,特别是一些包含很多复杂数据的.不规则的表格,为保证打印时每一页的排版美观性或者数据的前后连接的完整性,此时的分页符就发挥了极大的作用.因 ...
- PAT1035: Password
1035. Password (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To prepare f ...
- String的split()方法可以将字符串按照特定的分隔符拆分成字符串数组
在java.lang包中有String.split()方法,返回是一个数组------不管按照什么拆,拆出来是一个数组 String str = "1,2,3,4,5,6"; St ...
- struct和union的区别
1)union是几个不同类型的变量共占一段内存(相互覆盖):struct是把不同类型的数据组合成一个整体 2)对齐方式略有区别:union不需要+,只需要拿出对齐后的最长 structure unio ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- Azure Go Management SDK 中国版使用示例
简介 刚学习go几天,尝试调用Azure的SDK进行管理API的操作,基本思路是基于注册的AD Application信息生成token,然后再使用Token生成serviceClient,然后再进行 ...
- JavaScript设计模式 Item 5 --链式调用
1.什么是链式调用 这个很容易理解,例如: $(this).setStyle('color', 'red').show(); 一般的函数调用和链式调用的区别:调用完方法后,return this返回当 ...