Docker Doc之一:小白入门
Docker是什么
2013 年初,PaaS 提供商 dotCloud 开源了一个基于 LXC 的高级容器引擎Docker,源代码托管在 Github 上, 基于go语言(google公司开源)并遵从Apache2.0协议开源。一款开源软件能否在商业上成功,很大程度上依赖三件事 (很幸运Docker全部满足o_o)
- 成功的 User Case(用例)
- 活跃的社区
- 一个好故事
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
想象一下
Docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

为什么要用Docker
当前虚拟机的难点
- 管理环境复杂
- 从各种OS到各种中间件到各种应用, 一款产品能够成功作为开发者需要关心的东西太多,这个问题几乎在所有现代IT相关行业都需要面对。
- 大小
- 一个典型的虚拟机文件是千兆字节,如果是几十千兆字节。这使得它们跨网络传输非常耗时,并且对磁盘空间有很大的要求。
- 启动时间
- 启动虚拟机意味着启动操作系统。对于Windows来说,这是一个挑战,因为启动新机器需要花费时间。这可以使处理突发交通困难。
- 内存
- 虚拟机需要将整个操作系统与应用程序一起加载到内存中。这意味着很多主机的内存被浪费了。
- 不一致性
- 相同的虚拟机可以复制到多个主机,主机必须提供相同的虚拟化硬件,这可能依赖于物理硬件。无法保证虚拟机在任何给定的主机上运行相同的操作。
So,Dcoker容器通过虚拟化操作系统来解决虚拟机的问题。容器只包含应用程序及其依赖项。文件大小要小很多倍,启动时间以秒为单位,只有应用程序加载到内存中,容器保证在任何主机上工作。鉴于容器的明显优势,.NET Core的设计决定之一就是使其成为模块化。这意味着你的.NET Core应用程序可以被“发布”,使得它和它的所有依赖关系在一个地方,这很容易放入容器。(摘自张队的介绍)

理论进阶
Doker原理
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
- 隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
- 可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
- 移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
- 安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
局限
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
- Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
- LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
- 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
- 网络管理相对简单,主要是基于namespace隔离
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
- Docker对disk的管理比较有限
- container随着用户进程的停止而销毁,container中的log等用户数据不便收集
针对1-2,有windows base应用的需求的基本可以pass了;
针对3-5主要是看用户的需求,到底是需要一个container还是一个VM, 同时也决定了docker作为 IaaS 不太可行。
针对6,7虽然是docker本身不支持的功能,但是可以通过其他手段解决(disk quota, mount --bind)。
总之,选用container还是vm, 就是在隔离性和资源复用性上做权衡。
总结
写下这篇小白文,希望对开发者们介绍一下Docker是什么,为什么要用Docker,Docker的原理和局限大概是什么?Docker给开发的感觉和KVM的感觉是很类似的,因为这些不由开发去管理维护,在成熟标准的公司里面,会有专业的运维团队去研究维护Docker的高可用和解决Docker遇到的问题,但是我们还是有必要去了解一些简单的方面,万一发现自己对Docker有很大的兴趣呢。接下来,我会继续讲解Docker的How以及更多扩展。如果有兴趣就关注一下,未完待续。
Docker Doc之一:小白入门的更多相关文章
- 小白入门Docker基础篇
docker是什么 百科上的解释是这样的: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- Web前端小白入门指迷
前注:这篇文章首发于我自己创办的服务于校园的技术分享 [西邮 Upper -- 004]Web前端小白入门指迷,写得很用心也就发在这里. 大前端之旅 大前端有很多种,Shell 前端,客户端前端,Ap ...
- 【Unity游戏开发】SDK接入与集成——小白入门篇
一.简介 通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感 ...
- React Native小白入门学习路径——五
React Native小白入门学习路径--五 序 "哦天呐!" 这句话成了我在实验室的口头禅, 老师可能觉得我们都是大神吧,都还在看着基础就给布置了那么多任务:写一个RN的TDD ...
- Docker Rest API使用入门
Docker Rest API使用入门 系统:Centos7.2, Docker版本信息如下: [python] view plain copy Client: Version: 17.03 ...
- DeepFaceLab小白入门(4):提取人脸图片!
通过上面级片文章,你应该基本知道了换脸的流出,也能换出一个视频来.此时,你可能会产生好多疑问,比如每个环节点点到底是什么意思,那些黑漆漆屏幕输出的又是什么内容,我换脸效果这么差,该如何提升?等等,好奇 ...
- Docker DOC
Docker DOC docker是提供给开发或管理人员的容器化部署项目工具 在linux上运行docker 常用命令 docker 安装 #先更新yum yum update; #设置docker仓 ...
- gitlab版本管理小白入门
在新公司入职已经一周了,由于刚好在版本空档期,没有什么开发任务,就自己熟悉熟悉代码什么的. 目前公司用的是git,原来公司用的是svn,今天就记录下从小白入门. gitlab分布式版本管理,理论介绍就 ...
- docker安装kafka快速入门
docker安装kafka快速入门 1.安装zookeeper docker search zookeeperdocker pull zookeeperdocker run -d -v /home/s ...
- Ruby小白入门笔记之<个人记录档>
书写缘由 快两年的JAVA开发,因为来到一家新公司,产品需要用Ruby开发,故此才有了这从头开始,一入编程深似海啊...... 因为入门时是JAVA,所以理念跟规范早已形成,故此感觉突然采用Ruby编 ...
随机推荐
- PPT文件太大时可以考虑另存为PPTX格式
遇到一个PPT文件有24M,30多页,里面主要有一些图片. 使用自带的图片压缩功能进行压缩,发现没有什么改变,后来找了一些工具软件压缩,最多也只能减少22%. 后来另存为PPTX格式,减小到1.74M ...
- [daily][mathematica][fcitx] mathematica 无法输入中文的问题
mathematica无法输入中文, 我的输入法使用 fcitx 于是我给fcitx的作者提了issue https://github.com/fcitx/fcitx/issues/372 数日之后, ...
- mybatis(二)--相关属性及相关细节
mapper接口动态代理 动态代理dao开发规则 1.namespace必需是接口的全路径名 2.接口的方法名 必需与 映射文件的sql id一致 3.接口的输入参数必需与映射文件的parameter ...
- webstorm项目的structure
https://www.jetbrains.com/help/webstorm/2016.1/symbols.html
- Java数组转List
问题:当使用Arrays.asList(a)将数组转为List集合后,进行add操作时,报UnsupportedOperationException异常. 数组转List,直接使用Arrays的asL ...
- Eclipse出现:An internal error occurred during: "Retrieving archetypes:". GC overhead limit exceeded的问题解决
网上说修改虚拟内存的方式,其实不太可行,最直接的方式就是删除以前的workspace,重新使用一个新的workspace.
- 58.Less介绍及其与Sass的差异
Less英文官网需要开启VPN才能正常访问,如果你无法打开Less官网,建议您移步到Alexis Sellier领导的团队所译的中文官网Less中文. ——大漠 事实证明,Less——以及Sass对于 ...
- shell bash-shell
bash shell中的命令替换,`cmd`或者$(cmd). bash shell中的变量赋值,直接name = var: (bash中的变量赋值不能中间有空格) 变量引用时,$name,如果na ...
- mysql日志介绍
1. 错误日志 错误日志记录的事件: a. 服务器启动关闭过程中的信息 b. 服务器运行过程中的错误信息 c. 事件调试器运行一个事件时间生的信息 d. 在从服务器上启动从服务器进程时产生的信息 2. ...
- ARM-ili9325屏调试1--时序
2011-06-21 22:04:54 LCD连接好了,读id,不成功.说明配置引脚或读写时序不对. 原来是软件引脚配置出错. 应该用如下. #define LCD_CS {3<<30 ...