冷冷的鹰眼 發表於 2019-1-10 10:55:00

为什么需要Docker?

<h1 id="前言">前言</h1>
<blockquote>
<p>只有光头才能变强。</p>
</blockquote>
<blockquote>
<p>文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y</p>
</blockquote>
<p>估计大家也可能听过Docker这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在<strong>网上冲浪</strong>的时候吹牛逼了。</p>
<p>所以这几天学了一下Docker,总结了Docker<strong>入门</strong>的相关知识,分享给大家(好让我们一起吹牛逼)。</p>
<p><img src="https://i.imgur.com/CR1Ddgg.png"></p>
<blockquote>
<p>I need a doctor,call me a doctor. I need a doctor, doctor, to bring me back to life .</p>
</blockquote>
<h1 id="一为什么需要docker">一、为什么需要Docker</h1>
<p>官方介绍(中文版):http://www.docker-cn.com/what-docker#/developers</p>
<blockquote>
<p>Docker 是世界领先的软件容器平台。<br>
开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。<br>
运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。<br>
企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。</p>
</blockquote>
<h2 id="11环境切换配置麻烦">1.1环境(切换/配置)麻烦</h2>
<p>一般我们写程序的,能接触到好几个<strong>环境</strong>:</p>
<ul>
<li>自己写代码的环境叫做开发环境。</li>
<li>给测试去跑的环境叫做测试环境。</li>
<li>测试完可以对外使用的叫做生产环境。</li>
</ul>
<p>其实我们在学习编程中,很多时间都浪费在“环境”上:</p>
<ul>
<li>如果我现在重装了系统,我想要跑我的<code>war/jar</code>包,我得去安装一下JDK、Tomcat、MySQL等配置各种的环境变量才能跑起来。</li>
<li>开开心心地跟着博主给出的步骤去写Demo,但总是有Bug。(这里我将<strong>版本/依赖</strong>也归纳在环境的范畴里边)。</li>
<li>好不容易在测试环境下跑起来了,在生产环境就各种出错!</li>
<li>跟着教学视频做分布式/集群的项目,跑一堆的虚拟机,每个虚拟机都要安装对应的环境。</li>
</ul>
<p>所以就有个笑话《千万不要跟程序员说,你的代码有bug》:</p>
<ul>
<li>他的第一反应是你的<strong>环境有问题</strong>,第二就是你是傻逼不会用吧。</li>
<li>你要跟他这么说:“这个程序运行的怎么运行的跟预期不一样,是我操作有问题吗?”。</li>
<li>这货就会第一反应“我擦,这是不是出bug了?”</li>
</ul>
<h2 id="12应用之间需要隔离">1.2应用之间需要隔离</h2>
<p>比如我写了两个应用(网站),这两个应用部署在同一台服务器上,那可能会出现什么问题?</p>
<ul>
<li>如果一个应用出现了问题,导致CPU占100%。那另一个应用也会受到关联,跟着一起凉凉了。</li>
<li>这两个应用是完全不同技术栈的应用,比如一个<code>PHP</code>,一个<code>.NET</code>。这两个应用<strong>各种的依赖软件</strong>都安装在同一个服务器上,可能就会造成<strong>各种冲突/无法兼容</strong>,这可能调试就非常麻烦了。</li>
</ul>
<h1 id="二docker是如何解决上述的问题的">二、Docker是如何解决上述的问题的</h1>
<h2 id="21解决环境切换配置">2.1解决环境(切换/配置)</h2>
<p>不知道大家有没有装过系统,比如说装Linux虚拟机,重装Windows系统,都是需要<strong>镜像</strong>的。</p>
<p><img src="https://i.imgur.com/3QNmeNq.png"></p>
<p>有了这个镜像,我们就可以<strong>运行</strong>这个镜像,来进行安装系统的操作(此处省略N个下一步),于是我们的系统就装好了。一般来说,我们去官方渠道下载的镜像,都是<strong>纯净</strong>的。比如去官方下载Windows镜像,装完后之后桌面只有一个回收站。</p>
<p>但有过了解装系统的同学可能就会知道,有的镜像装完可能还有360这些软件,但系统的的确确是<strong>变了</strong>。简单来说,就是这些镜像<strong>添加</strong>了其他的东西(比如360软件、腾讯、千千静听等等软件)。</p>
<p>Docker也是这种思路,可以将我们的想要的环境<strong>构建</strong>(打包)成一个镜像,然后我们可以<strong>推送</strong>(发布)到网上去。想要用这个环<br>
境的时候,在网上<strong>拉取</strong>一份就好了。</p>
<p>有了Docker,我们在搭环境的时候,跟以前的方式就不一样了。</p>
<ul>
<li><strong>之前</strong>:在开发环境构建出了一个war包,想跑到Linux下运行。我们得先在Linux下载好Java、Tomcat、MySQL,配置好对应的环境变量,将war包丢到Tomcat的webapps文件夹下,才能跑起来。</li>
<li><strong>现在</strong>:在Linux下直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把war包丢进去就好了。</li>
</ul>
<p><img src="https://i.imgur.com/yC1qTJf.png"></p>
<p>将Docker的镜像运行起来就是一两秒的事情而已,十分方便的。</p>
<h2 id="22解决应用之间隔离">2.2解决应用之间隔离</h2>
<p>说到这里,就得提出一个大家可能不认识的概念:LXC(Linux Containers)---&gt;Linux容器。</p>
<h3 id="221linux容器">2.2.1Linux容器</h3>
<blockquote>
<p>在Linux内核中,提供了<strong>cgroups</strong>功能,来达成资源的区隔化。它同时也提供了名称空间(<strong>namespace</strong>)区隔化的功能,<strong>使应用程序看到的操作系统环境被区隔成独立区间</strong>,包括进程树,网络,用户id,以及挂载的文件系统。</p>
</blockquote>
<p>简单来说就是:LXC是一个为Linux内核包含特征的<strong>用户接口</strong>。通过强大的API和简单的工具,它可以让Linux用户轻松的创建和托管系统或者应用程序容器。</p>
<h3 id="222回到docker">2.2.2回到Docker</h3>
<p>我们在翻看Docker的官方文档的时候,也很容易看见cgroup和namespace这两个名词:</p>
<p><img src="https://i.imgur.com/NeCJeKv.png"></p>
<p>来源维基百科:</p>
<blockquote>
<p>Early versions of Docker used LXC as the container execution driver, though LXC was made optional in v0.9 and support was dropped in Docker v1.10.</p>
</blockquote>
<p>lxc是<strong>早期版本</strong>docker的一个基础组件,docker 主要用到了它对 Cgroup 和 Namespace 两个内核特性的控制。新的Docker版本已经<strong>移除了</strong>对LXC的support。</p>
<h3 id="223docker在windows和mac">2.2.3Docker在Windows和Mac</h3>
<p>上面说了,Docker底层用的Linux的cgroup和namespace这两项技术来实现<strong>应用隔离</strong>,那Windows和Mac用户能用Docker吗?</p>
<ul>
<li><strong>之前</strong>,Windows和Mac使用Docker实际上就是跑了一层Linux虚拟机。
<ul>
<li>比如在Windows下安装的是<code>Docker Toolbox</code>,它需要<code>Oracle Virtual Box</code>来跑Docker</li>
</ul>
</li>
<li><strong>现在</strong>,Windows和Mac都已经原生支持Docker了。但需要一些<strong>安装的条件</strong>,详情可以查看官网
<ul>
<li>比如Windows:<code>Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V</code></li>
</ul>
</li>
</ul>
<p>参考资料:</p>
<ul>
<li>Windows 原生 Docker 正式商用
<ul>
<li>http://blog.daocloud.io/windows-docker/</li>
</ul>
</li>
</ul>
<h1 id="三虚拟机和docker">三、虚拟机和Docker</h1>
<blockquote>
<p>说到应用隔离和镜像,我就想起了<strong>虚拟机</strong>。今年下半年(此处省略.....),文体两开花(此处省略.....),要是我写文章写得不好,我是需要向XX谢罪的。</p>
</blockquote>
<p>估计大家都用过虚拟机,虚拟机也能实现对应用的隔离,安装<strong>特定的</strong>镜像也能跑出我们想要的环境。虚拟机已经发展了很久了,为什么我们还需要Docker呢?</p>
<p>这部分内容在官网也有相关的介绍:</p>
<ul>
<li>http://www.docker-cn.com/what-container#/virtual_machines</li>
</ul>
<p><img src="https://i.imgur.com/OHSBfcH.png"></p>
<p>一句话总结:Docker容器比虚拟机<strong>轻量</strong>多了!</p>
<h1 id="最后">最后</h1>
<p>Docker可以干嘛?</p>
<ul>
<li>将一整套环境打包封装成镜像,<strong>无需重复配置环境</strong>,解决环境带来的种种问题。</li>
<li>Docker容器间是进程隔离的,谁也不会影响谁。</li>
</ul>
<p>其实这篇文章主要是讲为什么我们需要Docker(<strong>在学习一项技术之前,必须要知道这项技术是用来干嘛的</strong>),Docker的一些概念和命令我还没介绍(留到下一篇啦)。如果还没看过【生活现场】从搬家到容器技术docker应用场景解析,可以先去看看~</p>
<p>我在学习Docker的时候也找到了不少的资源,想要获取Docker入门资源的同学可在公众号下回复“Docker”</p>
<blockquote>
<p>乐于分享和输出<strong>干货</strong>的Java技术公众号:<strong>Java3y</strong>。关注即可领取海量的视频资源!</p>
</blockquote>
<p><img src="https://i.imgur.com/M73xIhZ.jpg"></p>
<p>觉得我的文章写得不错,不妨点一下<strong>赞</strong>!</p>


</div>
<div id="MySignature" role="contentinfo">
    <strong>更多的文章可往:</strong>文章的目录导航<br><br>
来源:https://www.cnblogs.com/Java3y/p/10248675.html
頁: [1]
查看完整版本: 为什么需要Docker?