docker在web开发中得使用流程是怎样的?

来源于知乎:


作者:知乎用户
链接:https://www.zhihu.com/question/51134842/answer/124450760
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最近做过一个项目使用了Docker,下面我抛砖引玉,谈一下自己对Docker的理解。
在解答题主的问题之前,我们先搞清楚下面三点:
一、为什么使用Docker
二、使用Docker的正确姿势
三、Docker带来了哪些好处

一、为什么使用Docker
Docker一词意为码头工人,而Docker的功能也与集装箱类似。通常一个webapp并不会用到操作系统/虚拟机的全部功能,即操作系统/虚拟机对于一个webapp来说太过笨重。打个比方说,我要从宿舍去食堂,我并不需要一架飞机,只需要一辆自行车就够了,而Docker镜像就相当于是一辆自行车。你可以把Docker镜像理解为轻量化的虚拟机,当然二者有所不同,但是不在本文的讨论范围。

二、使用Docker的正确姿势
设想一个如下场景:
我们需要一个webapp,其功能是用户注册并将注册信息插入到数据库,环境为Ubuntu+Tomcat+Mysql,怎么做?
不使用Docker的话,我们通常会这样做,以Ubuntu为操作系统,然后安装Tomcat和MySQL,最后把app部署上就可以了。那么使用Docker会怎么做呢,在这个场景下,可以有两种方式:
1.仍然以Ubuntu为操作系统,然后构建一个安装有MySQL和Tomcat的Docker镜像,并把app部署到其中,最后启动Docker镜像就可以了。看起来好像和不使用Docker基本相同,甚至还要麻烦一些,是这样吗?别着急,继续往下看。
2.第二种方式则体现了Docker的"每个容器只做一件事情"的思想,我们构建两个镜像,一个仅安装Tomcat并部署我们的app,另一个仅安装MySQL,然后启动这两个镜像,得到两个容器,再利用Docker的容器互联技术将二者连接(Docker的容器是通过http连接的)。

三、Docker带来了哪些好处
看完上面的例子,你可能仍然不会觉得Docker有什么好处,其实真正使用了Docker之后,你会觉得简直爱不释手。粗略来说,Docker好处有:
1.保证了线上线下环境的一致性
我们在线下的开发环境使用Docker构建好weaapp的镜像后,可以直接在线上使用一个镜像,保证了线上线下环境的一致性,再也不会有在线下开发环境中运行正常,而部署到线上各种错误了。
2.极大的简化了webapp的部署流程
在不使用Docker时,我们部署app时,要先搭建好app运行所需环境,这个过程做过的人都知道多么枯燥繁琐,一不小心还出错。而有了Docker,我们只需要直接构建一个我们webapp的镜像然后将其运行即可,无论在多少台服务器中部署,都是如此。再比如,使用Docker之前要搭建一个WordPress对于新手来说是有些困难的,而有了Docker,只需要从DockerHub上pull一个WordPress镜像并启动就可以了,非常非常方便。
3.实现了沙盒机制,提高了安全性
由于webapp运行在容器中,与操作系统隔离开了,从而使操作系统基本不可能受到破坏,另外如果webapp因为攻击而瘫痪,并不需要重启服务器,直接重启容器或者再启动一个镜像就可以了。
4.实现了模块化,提高了复用性
在二中使用Docker的第二种方式就可以看出,我们将数据库和Tomcat运行在不同的容器中,从某种角度来说,这也降低了模块之间的耦合性,便于拓展。比如我们要把MySQL替换为oracle,只需要再构建一个oracle镜像并启动与Tomcat连接即可,非常方便。对于我们构建的镜像,在其他app中直接拿来用就可以了,不必重复劳动。
5.实现了虚拟化,提高硬件利用率
有了Docker,我们可以在一台服务器上运行很多webapp,充分利用闲置资源。这时候,服务器的操作系统就类似于货轮,而一个个Docker容器就相当于货轮上的一个个集装箱。现在大热的云服务市场,不少就用了Docker。举个例子来说,现在我们有一台操作系统为Ubuntu14.04的服务器,我们构建不同版本的ubuntu镜像并启动,并且为不同的用户分配不同的容器。这样,用一台服务器
可以虚拟出n个运行着不同操作系统的虚拟服务器,而对于用户来说,这些是透明的––用户则认为自己拥有一台完整的服务器。据我推测,阿里云的服务器就是这么干的。这充分利用了闲置的硬件资源。

我这里挂一漏万,Docker的好处远远不止这些。譬如使用Docker镜像实现磁盘快照功能,在不同场景下有Docker不同的使用姿势,至于更多奇技淫巧,则需要在使用过程在去发掘。

啰嗦了这么一大堆,接下来回答题主的问题。实际上很多问题前文都已经解答了。

Docker的容器是以镜像来创建的,镜像是不是一个类似操作系统的环境?
是的,你可以将Docker理解为一个轻量化的虚拟机,至于我们经常说的什么Tomcat镜像、MySQL镜像之类的,只是这个轻量化的虚拟机中安装了相应的软件。镜像的名字也就说明了镜像的功能。

是不是到正式环境上还要安装Docker,然后把应用部署在其中?
是的,构建Docker镜像、运行Docker容器,都需要安装Docker,但这是一劳永逸的,因为我们使用的是安装了各种各样功能软件的Docker镜像和Docker容器。

如果是这样,那和我创建一个和生产环境一样的虚拟机来部署应用有什么区别?
首先这个问题可以用自行车和飞机的例子解答。其次安装Docker后,我们可以从DockerHub上获取各种各样的操作系统镜像,这个操作很简单,只需要pull相应的镜像到本地然后运行即可,而安装不同版本的虚拟机有多麻烦?另外DockerHub上有各种各样的优秀镜像,我们直接拿来使用就可以了,不需要自己搭建,应用的部署就像搭积木一样简单。




用docker最大的好处是你可以把你的应用以及应用运行依赖的环境和配置一起打包交付,做到开箱即用。利用容器部署应用,只需要下载一个你需要的镜像,然后把镜像run起来就可以了,跟你启动一个二进制程序是一样的。容器启动起来以后,应用就可以直接访问了,不需要再去部署应用。如果是用虚拟机的话,你还要先装虚拟机,然后装运行环境,然后再安装应用,配置,再启动应用,比较麻烦,整个过程费时费力。当然在虚拟机环境下,你也可以利用模板将所有这些过程自动化,也可以做到开箱即用。但问题是,虚拟机创建和运行都很耗时耗资源,docker容器可以做到秒级别的启动。虽然现在有些虚拟机技术也可以到很快启动,占很少的资源,但总体来说还是没有容器轻量级和方便。利用docker镜像,可以很容易保证开发测试和生产环境的一致性。虚拟机更适合做为IT基础设施来使用,而容器更适合跑应用。




给个标准答案,不用谢:

1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

5)方便持续集成,通过与代码进行关联使持续集成非常方便;

6)可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

再透露一些信息,以便对docker了解更多一些,国内做docker容器的公司现在不多,都有免费试用的服务,如果你感兴趣可以一家一家去玩玩儿,精灵云、道云、时速云、灵雀云等,这四家我都已经玩儿了一遍。



楼上回答的很好了。

关于部署,我再补充一句:

  • 传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;
  • Docker的部署模式是:复制->运行。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值